我有一个列表
[[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]
的第二个元素相加。
如果要对长度为1,000的列表进行操作,最有效的方法是什么?
我有一个列表
[[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]
的第二个元素相加。
如果要对长度为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]]
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]
collections.defaultdict
,它具有O(n)复杂度,并避免了Pandas / NumPy在您处理的小数组中的开销。 - jpp