defaultdict 的 defaultdict?

2025-03-04 08:24:00
admin
原创
41
摘要:问题描述:有没有办法可以defaultdict(defaultdict(int))使以下代码正常工作?for x in stuff: d[x.a][x.b] += x.c_int d`x.a需要根据和x.b`元素进行临时构建。我可以使用:for x in stuff: d[x.a,x.b] +...

问题描述:

有没有办法可以defaultdict(defaultdict(int))使以下代码正常工作?

for x in stuff:
    d[x.a][x.b] += x.c_int

d`x.a需要根据和x.b`元素进行临时构建。

我可以使用:

for x in stuff:
    d[x.a,x.b] += x.c_int

但这样我就不能使用:

d.keys()
d[x.a].keys()

解决方案 1:

是的,就像这样:

defaultdict(lambda: defaultdict(int))

当您尝试访问不存在的键时,将调用a 的参数defaultdict(在本例中为)。它的返回值将被设置为该键的新值,这意味着在我们的例子中 的值将为。lambda: defaultdict(int)`d[Key_doesnt_exist]`defaultdict(int)

如果您尝试从最后一个默认字典访问一个键,d[Key_doesnt_exist][Key_doesnt_exist]它将返回 0,这是最后一个默认字典参数的返回值int()

解决方案 2:

defaultdict 构造函数的参数是用于构建新元素的函数。因此,让我们使用 lambda 吧!

>>> from collections import defaultdict
>>> d = defaultdict(lambda : defaultdict(int))
>>> print d[0]
defaultdict(<type 'int'>, {})
>>> print d[0]["x"]
0

从 Python 2.7 开始,使用 Counter 有一个更好的解决方案:

>>> from collections import Counter
>>> c = Counter()
>>> c["goodbye"]+=1
>>> c["and thank you"]=42
>>> c["for the fish"]-=5
>>> c
Counter({'and thank you': 42, 'goodbye': 1, 'for the fish': -5})

一些额外功能

>>> c.most_common()[:2]
[('and thank you', 42), ('goodbye', 1)]

有关更多信息,请参阅PyMOTW - 集合 - 容器数据类型和Python 文档 - 集合

解决方案 3:

先前的答案已经解决了如何制作两级或 n 级的问题defaultdict。在某些情况下,您需要一个无限的:

def ddict():
    return defaultdict(ddict)

用法:

>>> d = ddict()
>>> d[1]['a'][True] = 0.5
>>> d[1]['b'] = 3
>>> import pprint; pprint.pprint(d)
defaultdict(<function ddict at 0x7fcac68bf048>,
            {1: defaultdict(<function ddict at 0x7fcac68bf048>,
                            {'a': defaultdict(<function ddict at 0x7fcac68bf048>,
                                              {True: 0.5}),
                             'b': 3})})

解决方案 4:

我发现使用起来稍微更优雅一些partial

import functools
dd_int = functools.partial(defaultdict, int)
defaultdict(dd_int)

当然,这与 lambda 相同。

解决方案 5:

作为参考,可以defaultdict通过以下方式实现通用嵌套工厂方法:

from collections import defaultdict
from functools import partial
from itertools import repeat


def nested_defaultdict(default_factory, depth=1):
    result = partial(defaultdict, default_factory)
    for _ in repeat(None, depth - 1):
        result = partial(defaultdict, result)
    return result()

深度定义了使用中定义的类型之前嵌套字典的数量default_factory。例如:

my_dict = nested_defaultdict(list, 3)
my_dict['a']['b']['c'].append('e')

解决方案 6:

其他人已经正确回答了您的问题:如何使以下操作正常工作:

for x in stuff:
    d[x.a][x.b] += x.c_int

另一种方法是使用元组作为键:

d = defaultdict(int)
for x in stuff:
    d[x.a,x.b] += x.c_int
    # ^^^^^^^ tuple key

这种方法的优点在于它很简单,并且可以轻松扩展。如果您需要三级深度映射,只需使用三项元组作为键即可。

解决方案 7:

defaultdict(lambda: defaultdict(int))有一个缺陷,就是它不友好pickle,这要归咎于lambda。虽然你可以全局定义默认函数,例如:

def make_defaultdict_int():
    return defaultdict(int)
dd = defaultdict(make_defaultdict_int)

解决这个问题,这太冗长了。幸运的是,pickle不用这样做,就可以很容易地以友好的方式完成这项工作:

dd = defaultdict(defaultdict(int).copy)

这会使模板为空defaultdict(int),并从中传递一个绑定copy方法作为工厂函数。因为defaultdict和是int可腌制的,所有可腌制对象的绑定方法也是如此,这使得结构完全可腌制,而无需任何自定义定义或额外导入。在某些版本的 Python 中,它比等效方法性能更高lambda(取决于最近的优化工作集中在哪里),但即使不是,性能也是可比的,而且它不会更冗长,所以即使腌制不是问题,这也是我的首选方法,只是因为这意味着当腌制变得重要时,我不需要改变方法。

解决方案 8:

import collections

d = collections.defaultdict(collections.Counter)

for x in stuff:
    d[x.a][x.b] += x.c_int
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2019  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1450  
  在当今快节奏的商业环境中,项目报告不仅是项目进展的展示,更是团队沟通、决策支持和资源优化的重要工具。然而,传统的项目报告往往过于冗长、复杂,难以直观地传达关键信息。为了让项目报告更加直观、高效,选择合适的工具至关重要。本文将介绍10款能够显著提升项目报告直观性的工具,帮助项目经理和团队更好地管理项目、提高效率。信创国产...
开源项目管理工具   0  
  在当今快速变化的商业环境中,项目经理的角色变得愈发重要。他们不仅需要协调团队、管理资源,还要确保项目按时、按预算完成。为了应对这些挑战,项目经理们越来越依赖高效的管理工具。2025年,随着技术的不断进步,项目管理工具也在不断演进。本文将为您推荐10个高评分的项目管理工具,帮助您在未来的项目中更加得心应手。信创国产项目管...
项目管理系统   0  
  在当今快速发展的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目成功的关键工具。随着技术的不断进步,2025年市场上涌现了众多功能强大、用户友好的项目管理软件。本文将深入探讨10款行业标杆项目管理软件,帮助您选择最适合的工具。信创国产项目管理软件 - 禅道禅道是一款国产开源的项目管理软件,禅道开源版不...
测试管理工具   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用