繁体   English   中英

Python - 基于内部列表的第一个元素对列表列表中的元素求和

[英]Python - Summing elements on list of lists based on first element of inner lists

我有一份清单

[[0.5, 2], [0.5, 5], [2, 3], [2, 6], [2, 0.6], [7, 1]]

我要求输出汇总每个子列表中的第二个元素,以获得唯一的第一个元素。 在这种情况下,它是:

[[0.5, 7], [2, 9.6], [7, 1]]

其中[0.5, 7][0.5, 2][0.5, 5] [0.5, 2]的第二个元素的总和。

对于长度为1,000的列表,最有效的方法是什么。

累积defaultdict

>>> from collections import defaultdict
>>> data = defaultdict(int)
>>> L = [[0.5, 2], [0.5, 5], [2, 3], [2, 6], [2, 0.6], [7, 1]]
>>> for k, v in L:
...     data[k] += v
...     
>>> [[k,v] for (k,v) in data.items()]
[[0.5, 7], [2, 9.6], [7, 1]]

请注意,2的值通过添加自动“提升”为浮点数,即使这是int的默认值。 这是为了匹配问题中发布的所需输出,但我认为您应该考虑使用同类输出类型而不是int和float的混合。

使用Pandas,您可以保留数据的原始“顺序”:

pairs = [[0.5, 2], [0.5, 5], [2, 3], [2, 6], [2, 0.6], [7, 1]]
df = pd.DataFrame(pairs)
>>> [tup[0] for tup in zip(df.groupby(0, sort=False, as_index=False).sum().values.tolist())]
[[0.5, 7.0], [2.0, 9.6], [7.0, 1.0]]

你可以放弃排序和itertools.groupby

from operator import itemgetter
from itertools import groupby

data = [[0.5, 2], [0.5, 5], [2, 3], [2, 6], [2, 0.6], [7, 1]]

key = itemgetter(0)
data.sort(key=key)  # Use data = sorted(data, key=key) to avoid clobbering
result = [[k, sum(group)] for k, group in groupby(data, key)]

这不会保留密钥的原始顺序。

这会有用吗?

L = [[0.5, 2], [0.5, 5], [2, 3], [2, 6], [2, 0.6], [7, 1]]
nums = []
d = {}
for lst in L:
    if lst[0] not in d:
        d[lst[0]] = []
        nums.append(lst[0])
    d[lst[0]].append(lst[1])

for key in nums:
    print [key, sum(d[key])]

输出:

[0.5, 7]
[2, 9.6]
[7, 1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM