簡體   English   中英

將所有鍵值附加到字典值列表中的列表中

[英]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是存在於密鑰的值列表24 ,和5 我們將在字典中創建一個新的key =6value = 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.

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