1

我知道如何交换字典中的键和值,但我不知道如果我想将一个集合作为与该值对应的多个键的值,我应该怎么做。

我有以下代码:

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

但是如何将值添加到属于 key 的相应集合中dict2[v]

4

3 回答 3

3

你可以使用一个defaultdict.

from collections import defaultdict
swapped = defaultdict(set)
for k, v in source.iteritems():
    swapped[v].add(k)

defaultdict使用作为工厂初始化参数提供的可调用对象,透明地在任何尚未访问的键上创建一个值。以上基本等价于:

swapped = {}
for k, v in source.iteritems():
    if v not in swapped:
        swapped[v] = set()
    swapped[v].add(k)
于 2013-04-19T17:23:40.287 回答
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'])})


或者,您可以让dict2adict代替 a collections.defaultdict(set),并使用以下setdefault方法:

def bind(dict1):
    dict2 = {}
    for k, v in dict1.items():
        dict2.setdefault(v,set()).add(k)
    return dict2

参考:

于 2013-04-19T17:23:24.563 回答
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'])})
于 2013-04-19T17:23:37.740 回答