gpt4 book ai didi

python 字典: get vs setdefault

转载 作者:IT老高 更新时间:2023-10-28 20:38:16 27 4
gpt4 key购买 nike

以下两个表达式似乎与我等价。哪一个更可取?

data = [('a', 1), ('b', 1), ('b', 2)]

d1 = {}
d2 = {}

for key, val in data:
# variant 1)
d1[key] = d1.get(key, []) + [val]
# variant 2)
d2.setdefault(key, []).append(val)

结果是一样的,但哪个版本更好或更pythonic?

我个人觉得第 2 版更难理解,因为对我来说 setdefault 很难掌握。如果我理解正确,它会在字典中查找“key”的值,如果不可用,则在字典中输入“[]”,返回对该值或“[]”的引用并将“val”附加到那个引用。虽然肯定很流畅,但至少不直观(至少对我而言)。

在我看来,版本 1 更容易理解(如果可用,获取“key”的值,如果不可用,获取“[]”,然后加入由 [val] 组成的列表并将结果放入“ key ”)。但是,虽然更直观地理解,但我担心这个版本的性能会降低,所有这些列表都会创建。另一个缺点是“d1”在表达式中出现了两次,这很容易出错。使用 get 可能有更好的实现,但目前它让我望而却步。

我的猜测是,第 2 版虽然对没有经验的人来说更难掌握,但速度更快,因此更可取。意见?

最佳答案

你的两个例子做同样的事情,但这并不意味着 getsetdefault 做。

两者的区别基本上是手动设置d[key]每次都指向列表,而setdefault自动设置d[key] 仅在未设置时才添加到列表中。

使这两种方法尽可能相似,我跑了

from timeit import timeit

print timeit("c = d.get(0, []); c.extend([1]); d[0] = c", "d = {1: []}", number = 1000000)
print timeit("c = d.get(1, []); c.extend([1]); d[0] = c", "d = {1: []}", number = 1000000)
print timeit("d.setdefault(0, []).extend([1])", "d = {1: []}", number = 1000000)
print timeit("d.setdefault(1, []).extend([1])", "d = {1: []}", number = 1000000)

得到了

0.794723378711
0.811882272256
0.724429205999
0.722129751973

因此,setdefaultget 快 10% 左右。

get 方法允许您比使用setdefault 做的更少。您可以使用它来避免在 key 不存在时出现 KeyError(如果这种情况会经常发生),即使您不想设置 key 也是如此。

Use cases for the 'setdefault' dict methoddict.get() method returns a pointer有关这两种方法的更多信息。

关于 setdefault 的线程得出结论,大多数时候,您想使用 defaultdict。关于 get 的线程得出的结论是它很慢,并且通常最好(速度方面)进行双重查找,使用默认字典或处理错误(取决于字典的大小和您的用例)。

关于 python 字典: get vs setdefault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423428/

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