首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python 3中,使用具有多个重复值的字典中的值交换键

在Python 3中,使用具有多个重复值的字典中的值交换键
EN

Stack Overflow用户
提问于 2013-04-20 01:19:29
回答 3查看 2.1K关注 0票数 1

我知道如何在字典中交换键和值,但是如果我想为与该值相对应的多个键设置一个值,我不知道该怎么做。

我有以下代码:

代码语言:javascript
运行
复制
def bind(dict1):
dict2 = {}
for k, v in dict1.items():
    dict2[v] = {k}
return dict2

问题是,例如,如果我输入

代码语言:javascript
运行
复制
bind({'Europa': 'Jupiter', 'Psamathe': 'Neptune', 'Cordelia': 'Uranus', 'Cupid': 'Uranus'})

它将返回以下内容:

代码语言:javascript
运行
复制
{'Jupiter': {'Europa'}, 'Neptune': {'Psamathe'}, 'Uranus': {'Cupid'}}

虽然我需要:

代码语言:javascript
运行
复制
{'Jupiter': {'Europa'}, 'Neptune': {'Psamathe'}, 'Uranus': {'Cupid', 'Cordelia'}}

我尝试将空集作为新字典的值,方法是输入:

代码语言:javascript
运行
复制
def bind(dict1):
dict2 = {}
for k, v in dict1.items():
    dict2[v] = {}
return dict2

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

EN

回答 3

Stack Overflow用户

发布于 2013-04-20 01:23:40

你可以使用defaultdict

代码语言:javascript
运行
复制
from collections import defaultdict
swapped = defaultdict(set)
for k, v in source.iteritems():
    swapped[v].add(k)

defaultdict使用作为工厂初始化参数提供的callable,透明地在任何尚未访问的键处创建值。以上内容基本等同于:

代码语言:javascript
运行
复制
swapped = {}
for k, v in source.iteritems():
    if v not in swapped:
        swapped[v] = set()
    swapped[v].add(k)
票数 3
EN

Stack Overflow用户

发布于 2013-04-20 01:23:25

代码语言:javascript
运行
复制
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':设置(‘欧罗巴’),‘海王星’:设置(‘Psamathe’),‘天王星’:设置(‘Cordelia’,‘丘比特’)})

或者,您可以让dict2成为dict而不是collections.defaultdict(set),并使用setdefault方法:

代码语言:javascript
运行
复制
def bind(dict1):
    dict2 = {}
    for k, v in dict1.items():
        dict2.setdefault(v,set()).add(k)
    return dict2

参考文献:

  • set.add
  • collection.defaultdict
  • dict.setdefault
票数 2
EN

Stack Overflow用户

发布于 2013-04-20 01:23:38

代码语言:javascript
运行
复制
>>> 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16110151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档