这是上天送给我的:

>>> from collections import defaultdict
>>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
>>> d = infinite_defaultdict()
>>> d['x']['y']['z'] = 10

通过Raymond Hettinger on Twitter
既然如此,我不明白我们为什么还要这样做:
mydict = defaultdict(list)
mydict = defaultdict(lambda: defaultdict(float))

等。。。。
但我可能错了。
是否有您想要避免的情况?
更新:
我试着基准时间
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"))

显然,无限的速度几乎是正常速度的两倍:
Infd = 0.632
Paind = 0.387

最佳答案

如果需要默认值为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'] }

09-16 06:57