簡體   English   中英

如果值相同,如何合並和切換鍵值?

[英]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.

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