gpt4 book ai didi

python - 集合是否有 'dict.setdefault' 等价物?

转载 作者:行者123 更新时间:2023-11-28 22:53:14 25 4
gpt4 key购买 nike

使用集合时的常见模式如下:

number_list = [1,5,7,2,4,4,1,3,8,5]
number_set = set()

for number in number_list:

#we only want to process the number if we haven't already processed it
if(number not in number_set):
number_set.add(number)

#do processing of 'number' here now that we know it's not a duplicate

if(number not in number_set):number_set.add(number) 让我很烦,因为我们在这里进行了两次哈希查找,而实际上我们应该这样做只需要一个。

字典有“setdefault”操作,它解决了一个非常相似的问题:“如果键在字典中存在,则返回值,否则插入这个默认值,然后返回默认值”。如果您天真地执行此操作,IE 以下内容,您将执行两次哈希查找,但 setdefault 允许您一次执行此操作

if item_key in dict:
dict[item_key].append(item_value)
else:
dict[item_key] = [item_value]

集合是否有等价的操作?类似于 if(number_set.check_if_contains_and_then_add(number)): 但给出了一个更好听的名字。

最佳答案

如果探查器告诉您哈希查找对运行时间有重要影响,那么这可能会解决它。

def add_value(container, value):
oldlen = len(container)
container.add(value)
return len(container) != oldlen

if add_value(number_set, number):
# process number

但为什么会这样呢?可能是由于 __hash__ 方法慢,虽然我现在可以告诉你 (a) 散列整数并不慢,并且 (b) 如果可能的话,最好用慢 __hash__ 缓存结果而不是减少调用次数。或者可能是由于较慢的 __eq__,这更难处理。最后,如果内部查找机制本身很慢,那么您可能无法做很多事情来加快程序速度,因为运行时一直在进行散列查找,在范围内查找名称。

set.add 返回一个指示集合是否改变的值可能会很好,但我认为这个想法违背了 Python 库的原则(诚然没有普遍支持) 除非它是操作的基础,否则变异操作不会返回值。所以 pop() 函数当然会返回一个值,但是 list.sort() 会返回 None,即使它偶尔对用户有用,如果它返回了 self

我想你可以这样做:

def deduped(iterable):
seen = set()
count = 0
for value in iterable:
seen.add(value)
if count != len(seen):
count += 1
yield value

for number in deduped(number_list):
# process number

当然,重复哈希查找是任何类型的问题纯粹是猜测:我通常会像在您的原始代码中那样用 if not in 测试编写这些函数中的任何一个,以及目的该功能将简化调用代码,而不是避免多余的哈希查找。

关于python - 集合是否有 'dict.setdefault' 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622656/

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