比较python中列表列表中的元素并找到匹配项

时间:2017-12-02 16:12:24

标签: python list set

我有一个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']]           

有人可以为此提供解决方案。

由于

1 个答案:

答案 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列表。

相关问题