Python3词典理解

Python3词典理解,python,python-3.x,dictionary-comprehension,Python,Python 3.x,Dictionary Comprehension,我很难理解词典 我有一个字典列表,其中每个字典包含具有不同值的相同键: 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], ...} 目前,我正在通过手动输入键并使用列表理解获取值来创建这个单一的、整合的

我很难理解词典

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

  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()方法,它不允许我将值添加到列表中-它会删除并“更新”已经存在的值。

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

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]}

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

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]}

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

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

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

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

使用Python库:


如果允许您使用熊猫,这是一个更简单的解决方案

使用熊猫,您将获得以下信息:

import pandas as pd
list_of_dicts = [{'k1':'v1', 'k2':'v2'}, {'k1':'v3', 'k2':'v4'},
                 {'k1':'v5', 'k2':'v6'}, {'k1':'v7', 'k2':'v8'},
                 {'k1':'v9', 'k2':'v10'}]
df = pd.DataFrame(list_of_dicts)
k = {c:df[c].tolist() for c in df.columns}
print (k)
其输出将为:

{'k1': ['v1', 'v3', 'v5', 'v7', 'v9'], 'k2': ['v2', 'v4', 'v6', 'v8', 'v10']}
使用这种方法,您可以继续添加任意数量的键,解决方案将是相同的

import pandas as pd
list_of_dicts = [{'k1':'v1' , 'k2':'v2' , 'k3': 'v3'},
                 {'k1':'v4' , 'k2':'v5' , 'k3': 'v6'},
                 {'k1':'v7' , 'k2':'v8' , 'k3': 'v9'},
                 {'k1':'v10', 'k2':'v11', 'k3': 'v12'},
                 {'k1':'v13' ,'k2':'v14', 'k3': 'v15'}]
df = pd.DataFrame(list_of_dicts)
k = {c:df[c].tolist() for c in df.columns}
print (k)
这将导致:

{'k1': ['v1', 'v4', 'v7', 'v10', 'v13'], 'k2': ['v2', 'v5', 'v8', 'v11', 'v14'], 'k3': ['v3', 'v6', 'v9', 'v12', 'v15']}

唯一的限制是每组DICT必须具有相同数量的元素(k1、k2、k3)。不能有(k1,k2)和(k1,k2,k3)。然后,当dataframe在每列中查找相同数量的元素时,代码将中断。

如果允许使用pandas,这是一个简单得多的解决方案

使用熊猫,您将获得以下信息:

import pandas as pd
list_of_dicts = [{'k1':'v1', 'k2':'v2'}, {'k1':'v3', 'k2':'v4'},
                 {'k1':'v5', 'k2':'v6'}, {'k1':'v7', 'k2':'v8'},
                 {'k1':'v9', 'k2':'v10'}]
df = pd.DataFrame(list_of_dicts)
k = {c:df[c].tolist() for c in df.columns}
print (k)
其输出将为:

{'k1': ['v1', 'v3', 'v5', 'v7', 'v9'], 'k2': ['v2', 'v4', 'v6', 'v8', 'v10']}
使用这种方法,您可以继续添加任意数量的键,解决方案将是相同的

import pandas as pd
list_of_dicts = [{'k1':'v1' , 'k2':'v2' , 'k3': 'v3'},
                 {'k1':'v4' , 'k2':'v5' , 'k3': 'v6'},
                 {'k1':'v7' , 'k2':'v8' , 'k3': 'v9'},
                 {'k1':'v10', 'k2':'v11', 'k3': 'v12'},
                 {'k1':'v13' ,'k2':'v14', 'k3': 'v15'}]
df = pd.DataFrame(list_of_dicts)
k = {c:df[c].tolist() for c in df.columns}
print (k)
这将导致:

{'k1': ['v1', 'v4', 'v7', 'v10', 'v13'], 'k2': ['v2', 'v5', 'v8', 'v11', 'v14'], 'k3': ['v3', 'v6', 'v9', 'v12', 'v15']}

唯一的限制是每组DICT必须具有相同数量的元素(k1、k2、k3)。不能有(k1,k2)和(k1,k2,k3)。然后代码将中断,因为dataframe在每列中查找相同数量的元素。

Pandas当然是允许的-我正计划使用列表字典创建dataframe!这是非常有帮助的,谢谢。熊猫让整个过程变得如此快速,你得到了更好的灵活性。希望你能探索它们。如果这个答案有帮助的话,别忘了向上投票。熊猫当然是允许的——我正计划用列表字典创建一个数据框!这是非常有帮助的,谢谢。熊猫让整个过程变得如此快速,你得到了更好的灵活性。希望你能探索它们。如果这个答案是有帮助的,别忘了投赞成票。如果您没有将变量名用作
,您会更愿意这样做,因为它可能会与dict.keys混淆,这是一个很好的解决方案!也可以在一条线上完成,这是理想的。dictionary_of_list={k:[i[k]for i in list_of_dictionary]for k in list of_dictionary[0]。keys()}喜欢列表理解。如果您没有将变量名用作
,您会更愿意这样做,因为它可能会与dict.keys混淆,这是一个很好的解决方案!也可以在一条线上完成,这是理想的。dictionary_of_list={k:[i[k]for i in list_of_dictionary]for k in list of_dictionary[0]。keys()}