2016-12-08 51 views
3

我如何在一個函數中創建一個字典,其鍵是給定字典的值,反之亦然,其中給定的字典每個鍵有多個值? 例如,給定的字典:返回一個包含給定字典值的鍵字典,反之亦然

d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]} 

我需要回到像一本字典:

d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]} 

我唯一的想法就是讓所有值的列表,然後手動檢查每個鍵每個值,但我不知道如何做到這一點,不知道鍵和值的數量。任何幫助將被廣泛讚賞。

回答

2

嘗試:

{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])是一組出現在原始字典的所有字母。然後我們做一個新的字典,其中每個條目是letter: [key for key in d if letter in d[key]],這意味着其中一個字母,映射到在原始字典中映射到它的數字列表。

+0

非常感謝,非常感謝! – Evan

1

使用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']} 
+0

這是優秀的,但沒有任何簡潔的方式做到這一點,但不導入模塊? – Evan

+0

而不是使用'defaultdict',你可以使用一個普通的'dict'並用'd3.setdefault(vi,[])。append(k)'替換'd3 [vi] .append(k)'。沒有必要的進口。 – AChampion

0
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) 
0

這裏是一個解決方案,我發現5 years ago

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']} 
相關問題