首页 > 解决方案 > 在 lambda 中使用 __iadd__?

问题描述

我试图解决这个小挑战:

您需要一个默认字典,每次查找不存在的键时使用不同的值,即计数器;1 表示第一个不存在的键,2 表示第二个键,依此类推。

我能够像这样解决它:

from collections import defaultdict

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

s=defaultdict(f)

奖金是尝试在一行中做到这一点。

s=defaultdict(lambda a=[0]: (a[0]+=1))

SyntaxError: 无效的语法 _________^

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

标签: pythonpython-3.xlambda

解决方案


有两个问题:

  1. ... += ...是语句,不是表达式。您可以__iadd__显式调用,除了...
  2. int没有定义__iadd__a[0] += 1只是实现为a[0] = a[0] + 1.

您需要做的是__setitem__显式调用以更新默认列表值的第 0 个元素。返回None,而不是a[0],因此您还需要一个or表达式来返回a[0](since 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

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


推荐阅读