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