Python 如何使用.get()在dictionary中添加已经存在于dictionary中的值

Python 如何使用.get()在dictionary中添加已经存在于dictionary中的值,python,dictionary,Python,Dictionary,我想通过使用.get()在重叠(我的意思是同一个)键中添加多个值 我已经用这些kewords搜索过谷歌了,但它们有点不同的问题。所以,我只是在寻找解决这个问题的新方法 ''' 字典={} dictionary[key]=dictionary.get(key,{})+{value} ''' 但显然,这段代码是不可能的,还有TypeError+:“set”和“set” 所以我尝试创建两个字典,并将默认值设置为[]和+[value] 但这也不管用 ''' 比如说, 钥匙=锻炼、学习、音乐等。。。 价值

我想通过使用.get()在重叠(我的意思是同一个)键中添加多个值

我已经用这些kewords搜索过谷歌了,但它们有点不同的问题。所以,我只是在寻找解决这个问题的新方法

''' 字典={}

dictionary[key]=dictionary.get(key,{})+{value} ''' 但显然,这段代码是不可能的,还有TypeError+:“set”和“set” 所以我尝试创建两个字典,并将默认值设置为[]和+[value] 但这也不管用

''' 比如说,

钥匙=锻炼、学习、音乐等。。。 价值观=运动:篮球、足球、学习:科学、历史、数学、肌肉:经典等

我想要的结果是

{'exercise':{'basketball','football'},{'study':{'science','history','math'},{'muscic':{'classic'} '''


我该怎么办?

你很接近了,但这并不完全正确:

dictionary[key] = dictionary.get(key, {}) + {value}
不幸的是,
{}
不是编写空的
集合的方式(因为它已经意味着一个空的
dict
,这将是不明确的);您需要
set()

您的
{value}
已正确地成为
集合

但要将两个集合合并在一起(即,将所有值从一个集合添加到另一个集合),需要使用
,而不是
+

因此:


实际上,您可以简化这一过程:

dictionary.setdefault(key, set()).add(value)
setdefault
一步完成
获取
并分配所有内容。然后,我们通过调用其
add
方法对查找或创建的集合进行变异。这意味着我们不需要创建一个单元素集合,只需与旧集合合并,就可以直接传递
value


或者,您可以将词典设置为
defaultdict(set)
,它将自动(实际上)将每个
dictionary[key]
转换为
dictionary.setdefault(key,set())
。这是好是坏取决于您是否有一些后续代码应该查找值并实际失败,而不是创建空集。

首先,错误是什么意思?基本上,
+
不是为集合定义的

>>> s1 = set([1])
>>> s2 = set([2])
>>> s1 + s2
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'set' and 'set'
切换到
union
可以解决您的问题(除了其他答案指出的
{}
是一本字典之外),但您可能对
defaultdict
感兴趣。比如:

from collections import defaultdict
dictionary = defaultdict(set)
dictionary[key].add(value)

.get
在缺少值时不添加该值。另外,
{}
是空的
dict
,而不是空的
集合(
set()
)。所以你可以这样做:

dictionary.setdefault(key, set()).add(value)
但这实际上相当低效,因为无论密钥是否已经存在,它都需要构造空的
set
s。因此,最好的解决方案是根据需要(当
不存在时)惰性地构造新的
集合


你真的需要词典还是不需要这样的词典
{'exercise':['basketball','football'],'study':['science','history','math'[,'muscic':['classic']…}
带有值列表的字典?事实上,
get
没有添加值在这里是不相关的,因为他将结果显式地分配回
字典[key]
。(当然,
setdefault
确实可以简化事情。)而且,
set()
也不是那么慢(毕竟,每次编写
[]
{}
时,它还必须创建一个新的列表或dict,这不是性能问题),两者都不是。
setdefault
。在
setdefault
defaultdict
之间选择的正确原因是您的所有代码是否都应该自动创建一个新值,或者您是否有“设置”代码应该创建一个新值,然后是“查找”代码应该失败。@abarnert:
set()
所需的时间大约是
[]
{}
的4倍,这是由于一般构造函数查找和调用效率低下(其中
[]
{}
具有直接的字节码支持)。诚然,尽管如此,成本还是相当小,但这一成本(无论是
set()
还是
[]
)这是
defaultdict
存在的部分原因。我同意可以让
.get
工作,但最初提出的方案更荒谬,因为它每次都需要不断构造多个新的
集(
{value}
,默认值,以及它们组合的结果),而不仅仅是在适当的位置更新单个
。当然,这需要将近100ns而不是30ns,但这在OP的情况下不太可能是相关的。清晰度可能会更重要,正确的行为肯定会更重要。如果您希望稍后获得
KeyError
,而不是静默获得创建新值时,使用
defaultdict
会导致一个错误。如果您希望在程序中的任何地方都有默认行为,并且在一个地方忘记了
setdefault
,那么不使用
defaultdict
会导致一个错误。至于最初的场景,一旦您修复了这个错误,它确实是荒谬的。这是真的这当然比使用
setdefault
defaultdict
并对
set
进行适当的修改要简单得多,但如果OP能够理解(并且几乎可以在没有帮助的情况下编写),那就比他们觉得不可思议的事情要好。(当然,每个人都应该学习
setdefault
defaultdict
,所以在这里也值得教它们。)你总是可以使用
mydefaultdict.default\u factory=None
@juanpa.arrivillaga当然,但是拥有一个当前没有默认的defaultdict比拥有一个普通的旧dict更清楚。
from collections import defaultdict
dictionary = defaultdict(set)
dictionary[key].add(value)
dictionary.setdefault(key, set()).add(value)
from collections import defaultdict

dictionary = defaultdict(set)

...

dictionary[key].add(value)