小编典典

在Python中执行列表/字典理解时可以访问当前对象吗?

python

试图想到一种方法来实现以下目的(将键的所有值相加):

>>> data = [('a',1),('b',3),('a',4),('c',9),('b',1),('d',3)]
>>> res = {}
>>> for tup in data:
...     res[tup[0]] = res.setdefault(tup[0],0) + tup[1]
... 
>>> res
{'a': 5, 'c': 9, 'b': 4, 'd': 3}

一线版,不使用itertools,collection等任何导入。

 { tup[0] : SELF_REFERENCE.setdefault(tup[0],0) + tup[1]  for tup in data }

在Python中是否可以使用对当前正在理解的对象的引用?如果没有,有没有办法在不使用任何导入的情况下以单行方式实现这一目标,即使用基本列表/字典理解和内置函数。


阅读 221

收藏
2020-12-20

共1个答案

小编典典

不,那里没有。dict理解会为每次迭代生成一个 项目,并且您的代码需要生成 更少的 项目(合并值)。

没有不使用(难看的,非pythonic的)副作用技巧,就无法访​​问早期迭代中生成的密钥。dict理解所要产生的对象尚不存在,因此也无法产生自引用。

只需坚持自己的for循环,它就会更具可读性。

另一种选择是使用排序和分组,O(NlogN)算法与直接循环的简单O(N):

from itertools import groupby
from operator import itemgetter

res = {key: sum(t[1] for t in group) 
       for key, group in groupby(sorted(data, key=itemgetter(0)), key=itemgetter(0))}
2020-12-20