我正在用 python 编程并有一个列表列表
a=[[1234,32.5,'John',1114],[1234,16.3,'John',1115],[1235,25.3,'John',1116],
[1239,16.3,'Lisa',1117]]
如何合并子索引中相似元素[0]
的列表并删除包含索引最小元素的列表[3]
?
预期输出:
a=[[1234,48.8,'John',1115],[1235,25.3,'John',1116],[1239,16.3,'Lisa',1117]]
自从
a[1][3] > a[0][3] (1116 > 1115)
a[0][1]
将被添加到a[1][1]
和a[0]
将被全部删除。
我打算将它用于包含数万个列表的列表。
编辑:
我做了:
old=[[1234,32.5,'John',1114],[1234,16.3,'John',1115],[1235,25.3,'John',1116],[1239,16.3,'Lisa',1117]]
memory=old[0]
new=[]
for x, t in enumerate(old):
if t==memory:
new.append([t[0],memory[1]+t[1],t[2],t[3]])
memory=t
但是如果在索引 [0] 中有两个以上相似的列表,这将不适用于列表,代码应该根据有多少相似元素一次又一次地运行。在应用程序中,我的列表列表将在特定索引中包含数百个类似元素。
您真正需要的是按常用键对数据进行分组。itertools.groupby
是为此而制作的,您可以使用operator.itemgetter
按每个子列表的关键元素进行分组。
一旦迭代组,跟踪您需要的相应总和和最大值并不难。这确实假设您打算保留最大值而不是删除最小值,因为在一个组中有超过 2 个元素会使在对第二个元素求和时无法做到这一点。
from itertools import groupby
from operator import itemgetter
def merge(data):
out_data = []
for _, group in groupby(data, key=itemgetter(0, 2)):
key_num, to_sum, key_name, to_max = next(group)
for _, sum_val, _, max_val in group:
to_sum += sum_val
to_max = max(to_max, max_val)
out_data.append([key_num, to_sum, key_name, to_max])
return out_data
演示
>>> a = [[1234,32.5,'John',1114],
[1234,16.3,'John',1115],
[1235,25.3,'John',1116],
[1239,16.3,'Lisa',1117]]
>>> merge(a)
[[1234, 48.8, 'John', 1115],
[1235, 25.3, 'John', 1116],
[1239, 16.3, 'Lisa', 1117]]
还值得注意的是,如果您有许多操作要应用于这样的表格数据,您可能需要查看Pandas 库。使用 Pandas,您的问题的简洁解决方案可能是
import pandas as pd
def pd_merge(data):
df = pd.DataFrame(data)
return (df.groupby((0, 2), as_index=False)
.agg({1: 'sum', 3: 'max'})
.sort_index(1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句