我有一个Python列表,每个列表包含5个元素。例如
lists = [['x1', 'y1', 'z1', '10', ''],
['x1', 'y1', 'z1', '', '5'],
['x2', 'y2', 'z2', '10', ''],
['x2', 'y2', 'z2', '10', ''],
['x1', 'y1', 'z1', '', '5'],
['x3', 'y3', 'z3', '', '40'],
['x2', 'y2', 'z2', '', '20']]
我想比较每个列表的前3个元素,如果匹配,那么对于匹配列表,我想添加每行的第4列,并将其与第5列匹配列表的总和进行比较。如果匹配列表集合中第4列和第5列的总和匹配,我将需要输出行。
所以在上面的例子中,输出应该是
output = [['x1', 'y1', 'z1', '10', '10'],
['x2', 'y2', 'z2', '20', '20']]
有人可以为此提供解决方案。
由于
答案 0 :(得分:2)
一线解决方案!
output = [l[:4] + [str(sum(int(j[4]) for j in lists if j[:3] == l[:3] and j[4]))] for l in (l for l in lists if l[3])]
将output
作为:
[['x1', 'y1', 'z1', '10', '10'], ['x2', 'y2', 'z2', '20', '20']]
我没有尝试解释这一行,而是将流程扩展为更大的for-loop
向下滚动,以便正确解释它是如何工作的。
output = []
for l in (l for l in lists if l[3]):
sm = 0
for j in lists:
if j[:3] == l[:3] and j[4]:
sm += int(j[4])
sm = str(sm)
if sm == l[3]:
output.append(l[:4] + [sm])
如何吗
好吧,我们正在遍历生成器中的列表:l for l in lists if l[3]
。本质上,我们只想开始遍历实际上在第三个索引中具有值的列表,以便我们可以总结具有相同前三个元素的其他列表,并将其与l[3]
进行比较。
然后我们将sum变量(sm
)声明为0
,我们将其他列表元素添加到。{/ p>
接下来,我们要开始循环遍历lists
中可能具有相同前三个元素的其他列表。
然后我们检查前三个元素是否相同(j[:3] == l[:3]
)并检查第四个元素中是否存在实际上要添加的内容(否则我们在尝试转换时会出错)空字符串到int
)。然后,如果它通过了此测试,我们会将j[4]
添加到sm
并继续到下一个列表。
接下来,我们将总和(sm
)转换为字符串,因为它是最终需要的数据类型,并将l[3]
转换为整数。
最后我们将这个字符串与原始列表中的第四个元素进行比较 - 如果它是相同的,那么我们将原始列表连同总和(使用列表连接)附加到output
列表。