这是上天赐给我的:
>>> from collections import defaultdict
>>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
>>> d = infinite_defaultdict()
>>> d['x']['y']['z'] = 10既然如此,我就不明白我们为什么要再这么做了:
mydict = defaultdict(list)
mydict = defaultdict(lambda: defaultdict(float))等等..。
但我可能错了。有没有你想避免infinite_defaultdict的情况?
更新:我试着对时间进行基准测试
from collections import defaultdict
def infdd():
infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
idd = infinite_defaultdict()
idd['x'] = [1,2,3]
def plaindd():
ddl = defaultdict(list)
ddl['x'] = [1,2,3]
if __name__ == '__main__':
import timeit
print "Infd = %.3f" % (timeit.timeit("infdd()",setup="from __main__ import infdd"))
print "Plaind = %.3f" % (timeit.timeit("plaindd()",setup="from __main__ import plaindd"))显然,infinite_dict的速度几乎是正常速度的两倍:
Infd = 0.632
Paind = 0.387发布于 2015-11-21 10:22:46
如果需要默认值为dict以外的值,则不应使用infinite_defaultdict。例如,如果要计数项或累积项数组,则需要默认值为数字或数组。
def group_by(key, items):
result = defaultdict(list)
for item in items:
result[key(item)].append(item)
return result
group_by(len, ['here', 'are', 'some', 'words'])
# -> { 3: ['are'] 4: ['here', 'some'], 5: ['words'] }https://stackoverflow.com/questions/22680866
复制相似问题