Python3词典理解

2024-04-18 04:52:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解词典

我有一个字典列表,其中每个字典包含具有不同值的相同键:

  list_of_dictionaries = [{k1:v1, k2:v2}{k1:v3, k2:v4}{k1:v5, k2:v6}, ...]

我希望有一个列表字典,其中每个键都有一个值,该值是字典列表中该键下的那些值的列表:

  dictionary_of_lists = {k1:[v1,v3,v5], k2:[v2,v4,v6], ...}

目前,我正在通过手动输入键并使用列表理解获取值来创建这个单一的、整合的字典:

dictionary_of_lists = {
   k1:[i[k1] for i in list_of_dictionaries],
   k2:[i[k2] for i in list_of_dictionaries],
   ...
}

有几个键还不错,但有二十多个键,重复代码看起来很混乱。我正在努力制定一个词典理解法,以达到同样的效果。类似于“对于此列表中的每个字典,将每个键对应的值添加到另一个字典中由相同键表示的列表中”?我尝试了dict.update()方法,它不允许我将值添加到列表中-它会删除并“更新”已经存在的值


Tags: of列表dictionary字典k2k1v3list
3条回答

使用Pythoncollectionslibs:

from collections import defaultdict


list_of_dictionaries = [{'k1': 'v1', 'k2':'v2'},
                        {'k1':'v3', 'k2':'v4'},
                        {'k1':'v5', 'k2':'v6'}]

res = defaultdict(list)

for element in list_of_dictionaries:
    for key, value in  element.items():
        res[key].append(value)

print(dict(res))

out: {'k1': ['v1', 'v3', 'v5'], 'k2': ['v2', 'v4', 'v6']}

一个简单的for循环就可以做到这一点,而且非常有效。
solution provided在列表中的所有词典上对每个键进行迭代

>>> from collections import defaultdict
>>> res = defaultdict(list)
>>> for d in list_of_dictionaries:
...     for k, v in d.items():
...             res[k].append(v)
... 

请注意,每行仅因使用的键而不同。这意味着应在以下位置迭代键:

list_of_dictionaries  = [{1: 2, 2: 3}, {1: 4, 2: 5}, {1: 6, 2: 7}]

# Only safe if you know there will always be at least one dictionary
keys = list_of_dictionaries[0].keys()  

dictionary_of_lists = \
     {k: [i[k] for i in list_of_dictionaries]
      for k in keys}  # A second level of iteration to automate what you were doing manually before

print(dictionary_of_lists)
>>> {1: [2, 4, 6], 2: [3, 5, 7]}

相关问题 更多 >