gpt4 book ai didi

python - 如何初始化字典中的值?

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:24 25 4
gpt4 key购买 nike

我有以下代码:

import json
stats = dict()
for line in input : # many many lines
for (field,value) in json.loads(line).iteritems() :
stats.get(field,very_expensive_initializer(field)).add(value)

问题在于 Python 并不懒惰,因此 very_expensive_initializer 为每一行中的每个字段调用一次,而不是为每个字段调用一次。对吧?

避免这种情况的正确方法是什么?

例如,这是否足够地道?

try :  s = stats[field]
except KeyError : s = stats[field] = very_expensive_initializer(field)
s.add(value)

最佳答案

如果默认值很昂贵,请测试 key :

item = stats.get(field) or very_expensive_initializer(field)
item.add(value)

或者如果 stats[field] 可以为空:

item = stats[field] if field in stats else very_expensive_initializer(field)
item.add(value)

or 和条件表达式都是惰性求值。

您仍然可以将其设为单行,但我不确定您是否应该这样做。以上与您的原始代码匹配。

请注意,这不会very_expensive_initializer(field)添加到stats!你也可以这样做:

if field not in stats:
stats[field] = very_expensive_initializer(field)

try:
item = stats[field]
except KeyError:
item = stats[field] = very_expensive_initializer(field)

如果 field 通常stats 中找不到,则选择第一个,如果仅在 field 中找到,则选择后者偶尔stats中找不到。

你的下一个选择是继承 dict 并添加一个 __missing__ 方法:

class subclassed_dict(dict):
def __missing__(self, key):
item = self[key] = very_expensive_initializer(key)
return item

然后将其用作stats:

stats = subclassed_dict()

每当您尝试访问尚不存在的 key 时,Python 将调用 __missing__

演示:

>>> def very_expensive_initializer(field):
... print 'Doing loads of work'
... return set()
...
>>> class subclassed_dict(dict):
... def __missing__(self, key):
... item = self[key] = very_expensive_initializer(key)
... return item
...
>>> stats = subclassed_dict()
>>> stats['foo'].add(2)
Doing loads of work
>>> stats['foo'].add(3)
>>> stats['foo'].add(4)
>>> stats['bar']
Doing loads of work
set([])
>>> stats['bar']
set([])

关于python - 如何初始化字典中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20379435/

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