![](/img/trans.png)
[英]How to merge two nested dictionaries in python, which have same keys and have array type values?
[英]How do you merge and switch keys with values if they have same values?
假設我有一本包含這些鍵和值的字典:
{'foo': 1, 'bar': 5,'foo1' : 1,'bar1' : 1,'foo2': 5}
我不能像這樣拉鏈他們
dict(zip(my.values(),my.keys()))
因為發生這種情況:
{1: 'foo', 5: 'bar'}
我想成為的輸出是:
{1:{'bar1','foo','foo1'},5:{'bar','foo2'}}
您應該使用collections.defaultdict()
。
from collections import defaultdict
result = defaultdict(list)
for k, v in my.items():
result[v].append(k)
給定鍵不能有多個值,因此此類數據結構中的值必須是列表。 您無法使用zip()
輕松進行此轉換; 您需要一個for
循環:
my = {'foo': 1, 'bar': 5, 'foo1': 1, 'bar1': 1,'foo2': 5}
rev = {}
for k, v in my.items():
rev.setdefault(v, []).append(k)
從問題中的編輯看來,您想要使用一組值。 這也很簡單:
for k, v in my.items():
rev.setdefault(v, set()).add(k)
您也可以按照Daniel的建議使用defaultdict
,但是僅出於此目的導入似乎有點過頭了。 取決於字典的大小,它可能會更快一些,因為使用setdefault()
我們將不斷創建並丟棄空容器。
對於具有功能性扭曲的單線代碼(雖然可能不是最易讀或性能最高的代碼):
import itertools, operator
my_dict = {'foo': 1, 'bar': 5, 'foo1' : 1,'bar1' : 1, 'foo2': 5}
inverse_dict = { k:map(operator.itemgetter(0), v) for k, v in itertools.groupby(sorted(my_dict.items(), key=operator.itemgetter(1)), operator.itemgetter(1)) }
要使用集合進行聚合,只需將映射值包裝在集合構造函數中即可。
inverse_dict = { k:set(map(operator.itemgetter(0), v)) for k, v in itertools.groupby(sorted(my_dict.items(), key=operator.itemgetter(1)), operator.itemgetter(1)) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.