[英]Append all key values to list that are present in value list of a dictionary
我主要關心的是更Python化地執行此操作。 下面的代碼有效,但看起來很笨拙。
我有一本字典,鍵映射到列表。 我想遍歷字典,看看每個鍵是否在值列表中,如果是,請將其附加到與該鍵值關聯的新列表中。 我將在下面發布示例以進行澄清。
為了簡化問題,說我有一個像這樣的字典:
my_dict = {1: [3], 2: [4,5,6], 3: [1,2], 4: [5,6], 5: [4,6], 6: [4,5]}
在my_dict中,鍵1
出現在鍵3
的值列表中,因此我們將創建一個新的dict,其中key = 1
,而value = list(3)
類似地,鍵6
是存在於密鑰的值列表2
, 4
,和5
。 我們將在字典中創建一個新的key =6
和value = list(2,4,5)
。
這是我們字典的最終輸出:
output_dict = {1: [3], 2: [3], 3: [1], 4: [2,5,6], 5: [2, 4, 6], 6: [2,4,5]}
到目前為止,我的代碼:
new_dict = {}
for k, v in my_dict.items():
new_dict[k] = []
for k , v in my_dict.items():
for k2 in new_dict.keys():
if k2 in v:
new_dict[k2].append(k)
非常感謝任何指針。 感謝您的時間。
您可以使用setdefault 反轉字典:
my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}
new_dict = {}
for key, values in my_dict.items():
for value in values:
new_dict.setdefault(value, []).append(key)
print(new_dict)
產量
{1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]}
這個想法是遍歷每個(鍵,值)對,然后將每個值用作鍵, setdefault
將處理鍵丟失時的情況。 一種替代方法是將空列表設置為new_dict
每個新鍵的默認值,例如:
# set the empty list for each new key in new_dict
new_dict = {}
for values in my_dict.values():
for value in values:
new_dict[value] = []
# fill new_dict
for key, values in my_dict.items():
for value in values:
new_dict[value].append(key)
這將產生與上述相同的輸出,第三個選項是使用collections.defaultdict並跳過第一個循環:
from collections import defaultdict
my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}
new_dict = defaultdict(list)
for key, values in my_dict.items():
for value in values:
new_dict[value].append(key)
print(new_dict)
產量
defaultdict(<class 'list'>, {1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]})
請注意,這將返回defaultdict,它是dict的子類。
為了完整起見,這是使用dict理解的另一個版本:
from itertools import chain
my_dict = {1: [3], 2: [4,5,6], 3: [1,2], 4: [5,6], 5: [4,6], 6: [4,5]}
vals = set(chain.from_iterable(my_dict.values()))
d = {val:[k for k, v in my_dict.items() if val in v] for val in vals}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.