在Lambda中使用__iadd__吗?

bis*_*son 4 python lambda python-3.x

我试图解决这个小挑战:

您想要一个defaultdict,每次查找不存在的键(即计数器)时使用一个不同的值;1表示第一个不存在的密钥,2表示第二个,等等。

我能够像这样解决它:

from collections import defaultdict

def f(a=[0]):
    a[0]+=1
    return a[0]

s=defaultdict(f)
Run Code Online (Sandbox Code Playgroud)

好处是尝试一行完成此操作。

s=defaultdict(lambda a=[0]: (a[0]+=1))
Run Code Online (Sandbox Code Playgroud)

SyntaxError:语法无效_________ ^

有没有办法在lambda中做到这一点?更新可变的默认arg并返回?

che*_*ner 6

有两个问题:

  1. ... += ...是一个陈述,而不是一个表达。您可以__iadd__明确呼叫,除了 ...
  2. int没有定义__iadd__; a[0] += 1只是实现为a[0] = a[0] + 1

您需要做的是__setitem__显式调用以更新默认列表值的第0个元素。那会返回None,而不是a[0],因此您还需要一个or表达式来返回a[0](自None or x == x)的值:

>>> s = defaultdict(lambda a=[0]: a.__setitem__(0, a[0] + 1) or a[0])
>>> s[6]
1
>>> s[9]
2
>>> s[6]
1
>>> s[8]
3
Run Code Online (Sandbox Code Playgroud)

(我会写defaultdict(itertools.count(0).__next__)我自己。)