试图想到一种方法来实现以下目的(将键的所有值相加):
>>> 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中是否可以使用对当前正在理解的对象的引用?如果没有,有没有办法在不使用任何导入的情况下以单行方式实现这一目标,即使用基本列表/字典理解和内置函数。
不,那里没有。dict理解会为每次迭代生成一个 新 项目,并且您的代码需要生成 更少的 项目(合并值)。
没有不使用(难看的,非pythonic的)副作用技巧,就无法访问早期迭代中生成的密钥。dict理解所要产生的对象尚不存在,因此也无法产生自引用。
dict
只需坚持自己的for循环,它就会更具可读性。
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))}