[英]Return a dictionary with keys for a given dictionary's values and vice versa
在函數中,我如何創建一個字典,其中鍵是給定字典的值,反之亦然,其中給定字典每個鍵有多個值? 例如,給定一個字典:
d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]}
我需要返回一個字典,如:
d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]}
我唯一的想法是列出所有值,然后手動檢查每個值的每個鍵,但我不知道如何在不知道鍵和值的數量的情況下這樣做。 任何幫助將非常感激。
嘗試:
{letter: [key for key in d if letter in d[key]] for letter in set(letter for key in d for letter in d[key])}
說明: set(letter for key in d for letter in d[key])
是一組顯示在原始字典中的所有字母)。 然后我們創建一個新的dict,其中每個條目都是letter: [key for key in d if letter in d[key]]
中的字母letter: [key for key in d if letter in d[key]]
,這意味着其中一個字母,映射到原始字典中映射到它的數字列表。
使用collections.defaultdict()
默認為list
碼:
import collections
d3 = collections.defaultdict(list)
for k,v in sorted(d.items()):
for vi in v:
d3[vi].append(k) # create list or append to existing list
print(dict(d3))
結果:
{'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
data = [(key, value) for key, values in d.items() for value in values]
d2 = defaultdict(list)
for value, key in data:
d2[key].append(value)
print(key, value)
這是我5年前找到的解決方案
from operator import itemgetter
from itertools import groupby
d = {'1': ['a', 'c'],'2': ['a', 'b', 'c'], '3': ['b']}
d2 = {x: [t[1] for t in group] for (x, group) in groupby(sorted(((j, k) for k, v in d.items() for j in v), key=itemgetter(0)), key=itemgetter(0))}
# {'a': ['1', '2'], 'c': ['1', '2'], 'b': ['2', '3']}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.