簡體   English   中英

如何通過字典列表中的鍵優化列表中值的分組?

[英]How to optimise the grouping of values in lists by key in a dictionary list?

下面的腳本有效,但我想知道是否有更快的解決方案? 對於非常大的字典列表,我注意到一個小的延遲。

from collections import defaultdict

input = [{"first": 1.56,
          "second": [1, 2, 3, 4]}, {"first": 7.786,
                                    "second": [5, 6, 7, 8]}, {"first": 4.4,
                                                              "second": [9, 10, 11, 12]}]
output = [{"first": [1.56, 7.786, 4.4],
          "second":[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]}]

my_dictionary = defaultdict(list)
for item in input:
    for key, value in item.items():
        my_dictionary[key].append(value)
print(my_dictionary)

#defaultdict(<class 'list'>, {'first': [1.56, 7.786, 4.4], 'second': [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]})

字典中的鍵似乎是相同的,因此您可以使用字典理解:

out = {k:[d[k] for d in input] for k in input[0]}

另一個非常快速的替代方法是使用cytoolz模塊。

# pip install cytoolz
from cytoolz.dicttoolz import merge_with
out = merge_with(list, *input)

Output:

{'first': [1.56, 7.786, 4.4],
 'second': [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]}

計時:

>>> my_input = input * 10000
>>> %%timeit
... my_dictionary = defaultdict(list)
... for item in my_input:
...     for key, value in item.items():
...         my_dictionary[key].append(value)
20.3 ms ± 2.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

>>> %timeit out = {k:[d[k] for d in my_input] for k in my_input[0]}
4.65 ms ± 541 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit out = merge_with(list, *my_input)
5.58 ms ± 2.09 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM