在Python中进行list/dict理解时是否可以访问当前对象?

Dhr*_*hak 3 python list-comprehension dictionary-comprehension

试图想出一个单行程来实现以下(总结一个键的所有值):

>>> 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}
Run Code Online (Sandbox Code Playgroud)

单行版本,不使用任何导入,如itertools,集合等.

 { tup[0] : SELF_REFERENCE.setdefault(tup[0],0) + tup[1]  for tup in data }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 6

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

没有办法访问先前迭代中产生的键,而不是使用(丑陋的,unpythonic)副作用技巧.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))}
Run Code Online (Sandbox Code Playgroud)