【问题标题】:Python, double autoenumerated defaultdictPython,双自动枚举默认字典
【发布时间】:2012-05-25 21:56:48
【问题描述】:

为了优化一些代码,我使用了以下代码:

a = defaultdict(lambda: len(a))
a[0] = 0
a[1] = 1
a[7] = 2
...

现在我的问题是我需要一个嵌套的 defaultdict,即

b = defaultdict(lambda: defaultdict(lambda: len(b[?]))
b[0][0] = 0
b[0][1] = 1
b[1][0] = 0
b[1][1] = 1
...

提前谢谢...

【问题讨论】:

  • defaultdict 无法做到这一点——您需要编写自己的自定义 dict 子类。

标签: python nested hashmap defaultdict


【解决方案1】:
def enumdict():
    a = defaultdict(lambda : len(a))
    return a

b = defaultdict(enumdict)

【讨论】:

  • 如何将其全部转换为一个 lambda 表达式?
  • 直接从您那里阅读关于这是如何实现它的最小方式的解释也是非常有建设性的
  • 我不知道这是否是最小的方式,实际上我更愿意为这个任务创建类——这感觉像是一个技巧。
  • 为此,重要的是a 是函数内的局部变量。您不能在 lambda 中分配变量。每次调用 enumdict 时,都会创建一个新的 lambda 函数,每个 lambda 引用不同的a
  • @JanneKarila,至少在 Python 2.x(但不是 3.x)中,您可以这样做,但是像您所做的那样将其写为命名函数会好一百万倍: b = defaultdict(lambda: [a for a in (defaultdict(lambda: len(a)),)][0])
【解决方案2】:

如果你想让它成为一个类:

class CountDict(defaultdict):
    def __init__(self):
        defaultdict.__init__(self, self.default_factory)

    def default_factory(self):
         sub = defaultdict()
         sub.default_factory = sub.__len__
         return sub

您通常不能在 lambda 中执行此操作,因为您需要将子默认 dict 分配给一个变量,以便之后能够获取其 len,这在 lambda 中是不可能的。 @Duncan 想出了一个解决方法,使用列表理解来充当分配。干得好 :) 但不要使用它.. :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多