簡體   English   中英

Python3字典理解

[英]Python3 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], ...}

目前,我正在通過手動輸入鍵並使用列表推導來獲取值來創建這個單一的綜合字典:

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

一個簡單的 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 collections庫:

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

如果允許您使用 pandas,這是一個更簡單的解決方案。

使用 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)

output 將是:

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

唯一的限制是每組 dicts 必須具有相同數量的元素(k1、k2、k3)。 您不能擁有 (k1,k2) 和 (k1,k2,k3)。 然后代碼將中斷,因為 dataframe 正在尋找每列相同數量的元素。

暫無
暫無

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

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