python - 在 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 中做到这一点?更新可变默认参数并返回?
解决方案
有两个问题:
... += ...
是语句,不是表达式。您可以__iadd__
显式调用,除了...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__)
自己写。)
推荐阅读
- char - 字符串索引超出范围,是否有比较两个字符串的正确方法?
- sql - 从主表中获取所有信息,其中子表中的日期字段超过 365 天 - 只是稍微复杂一点
- javascript - 如何比较当前活动标签的 URL
- c# - AS400 锁定未使用的文件
- r - Markdown > html : 将表格标题居中
- css - Google amp-lightbox:内容高于屏幕,无法滚动到顶部
- java - Spring TestRestTemplate 解析错误而不是抛出 HttpClientErrorException
- yarnpkg - 纱线安装:EISDIR:对目录的非法操作,读取
- javascript - 根据数组中对象的索引,为数组中的每个对象分配一个新的键,并具有唯一的 id
- python - 有没有一种简单的方法将字符串变量一分为二?