Python 如何使用.get()在dictionary中添加已经存在于dictionary中的值
我想通过使用.get()在重叠(我的意思是同一个)键中添加多个值 我已经用这些kewords搜索过谷歌了,但它们有点不同的问题。所以,我只是在寻找解决这个问题的新方法 ''' 字典={} dictionary[key]=dictionary.get(key,{})+{value} ''' 但显然,这段代码是不可能的,还有TypeError+:“set”和“set” 所以我尝试创建两个字典,并将默认值设置为[]和+[value] 但这也不管用 ''' 比如说, 钥匙=锻炼、学习、音乐等。。。 价值观=运动:篮球、足球、学习:科学、历史、数学、肌肉:经典等 我想要的结果是 {'exercise':{'basketball','football'},{'study':{'science','history','math'},{'muscic':{'classic'} '''Python 如何使用.get()在dictionary中添加已经存在于dictionary中的值,python,dictionary,Python,Dictionary,我想通过使用.get()在重叠(我的意思是同一个)键中添加多个值 我已经用这些kewords搜索过谷歌了,但它们有点不同的问题。所以,我只是在寻找解决这个问题的新方法 ''' 字典={} dictionary[key]=dictionary.get(key,{})+{value} ''' 但显然,这段代码是不可能的,还有TypeError+:“set”和“set” 所以我尝试创建两个字典,并将默认值设置为[]和+[value] 但这也不管用 ''' 比如说, 钥匙=锻炼、学习、音乐等。。。 价值
我该怎么办?你很接近了,但这并不完全正确:
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)