gpt4 book ai didi

将值添加到字典中的集合的 Pythonic 方法

转载 作者:行者123 更新时间:2023-11-28 19:33:58 24 4
gpt4 key购买 nike

假设我有一个集合字典:

d = {"foo":{1,2,3},
"bar":{3,4,5}}

现在假设我想将值 7 添加到键 foo 中找到的集合。这很容易:

d["foo"].add(7)

但是如果我们不确定 key 是否已经存在怎么办?事先检查感觉不是很pythonic:

if "baz" in dict:
d["baz"].add(7)
else:
d["baz"] = {7}

我试着变聪明,做了类似的事情

d["baz"] = set(d["baz"]).add(7)

但是你只是得到一个 KeyError 试图访问 set 构造函数中的错误 key 。

我是不是漏掉了什么,还是我需要硬着头皮看看再跳?如果是这种情况,我会理解,如果有一种简单的方法可以说“将此值添加到在该位置找到的集合,或者如果该位置没有集合,则创建一个,然后然后放入。

最佳答案

使用defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(set)
>>> d
defaultdict(<class 'set'>, {})
>>> d['foo'].add(1)
>>> d['foo'].add(2)
>>> d
defaultdict(<class 'set'>, {'foo': {1, 2}})
>>> d['bar'].add(3)
>>> d['bar'].add(4)
>>> d
defaultdict(<class 'set'>, {'foo': {1, 2}, 'bar': {3, 4}})
>>>

另外,如果你必须使用纯字典,你可以使用.setdefault方法:

>>> d2 = {}
>>> d2.setdefault('foo',set()).add(1)
>>> d2.setdefault('foo',set()).add(2)
>>> d2
{'foo': {1, 2}}
>>> d2.setdefault('bar',set()).add(3)
>>> d2.setdefault('bar',set()).add(4)
>>> d2
{'foo': {1, 2}, 'bar': {3, 4}}
>>>

编辑以添加时间比较

你应该注意到使用 defaultdict 更快:

>>> setup = "gen = ((letter,k) for letter in 'abcdefghijklmnopqrstuvwxyx'  for k in range(100)); d = {}"
>>> s = """for l,n in gen:
... d.setdefault(l,set()).add(n)"""
>>> setup2 = "from collections import defaultdict; gen = ((letter,k) for letter in 'abcdefghijklmnopqrstuvwxyx' for k in range(100)); d = defaultdict(set)"
>>> s2 = """for l,n in gen:
... d[l]=n"""
>>>
>>> import timeit
>>> timeit.timeit(stmt=s, setup=setup, number=10000)
0.005325066005752888
>>> timeit.timeit(stmt=s2, setup=setup2, number=10000)
0.0014927469965186901

关于将值添加到字典中的集合的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com