我知道如何在字典中交换键和值,但如果我想将一个集合作为与该值对应的多个键的值,我不知道应该怎么做。
我有以下代码:
def bind(dict1):
dict2 = {}
for k, v in dict1.items():
dict2[v] = {k}
return dict2
问题是,如果我输入
bind({'Europa': 'Jupiter', 'Psamathe': 'Neptune', 'Cordelia': 'Uranus', 'Cupid': 'Uranus'})
它将返回以下内容:
{'Jupiter': {'Europa'}, 'Neptune': {'Psamathe'}, 'Uranus': {'Cupid'}}
虽然我需要:
{'Jupiter': {'Europa'}, 'Neptune': {'Psamathe'}, 'Uranus': {'Cupid', 'Cordelia'}}
我尝试通过输入以下内容将空集作为新词典的值:
def bind(dict1):
dict2 = {}
for k, v in dict1.items():
dict2[v] = {}
return dict2
但是如何将值添加到属于键dict2[v]
?
答案 0 :(得分:2)
import collections
def bind(dict1):
dict2 = collections.defaultdict(set)
for k, v in dict1.items():
dict2[v].add(k)
return dict2
result = bind({'Europa': 'Jupiter', 'Psamathe': 'Neptune', 'Cordelia': 'Uranus', 'Cupid': 'Uranus'})
print(result)
产量
defaultdict(,{'Jupiter':set(['Europa']),'Neptune': set(['Psamathe']),'天王星':set(['Cordelia','Cupid'])})
或者,您可以让dict2
成为dict
而不是collections.defaultdict(set)
,并使用setdefault
方法:
def bind(dict1):
dict2 = {}
for k, v in dict1.items():
dict2.setdefault(v,set()).add(k)
return dict2
参考文献:
答案 1 :(得分:2)
>>> import collections
>>> out = collections.defaultdict(set)
>>> inval = {'Europa': 'Jupiter', 'Psamathe': 'Neptune', 'Cordelia': 'Uranus', 'Cupid': 'Uranus'}
>>> for k, v in inval.items():
... out[v].add(k)
...
>>> out
defaultdict(<type 'set'>, {'Jupiter': set(['Europa']), 'Neptune': set(['Psamathe']), 'Uranus': set(['Cordelia', 'Cupid'])})
答案 2 :(得分:2)
您可以使用defaultdict
。
from collections import defaultdict
swapped = defaultdict(set)
for k, v in source.iteritems():
swapped[v].add(k)
defaultdict
使用作为工厂的初始化参数提供的callable,在任何尚未访问的密钥上透明地创建一个值。以上基本等同于:
swapped = {}
for k, v in source.iteritems():
if v not in swapped:
swapped[v] = set()
swapped[v].add(k)