首页 > 解决方案 > 比较两个不均匀的列表元组

问题描述

我试图比较列表元组并仅在第一个值匹配时减去第二个值对。减法完成后,我想保留不在列表中的元组。在这种情况下,我会保留 ('2574529422', 1)。

我尝试的下面的代码返回一个空列表。我不知道为什么它不起作用,如果 allc[0] 在迭代时应该在 stmt[0] 中?

我试过了:

a = [(allc[0], stmt[1]-allc[1]) for allc,stmt in zip_longest(self.allocation_results, self.statement_results)
             if allc[0] in stmt[0]]

输入:

List 1

[('0856547518', 2), ('1292058151', 5), ('2574529422', 3)]

List 2

[('0856547518', 1), ('1292058151', 3), ('2574529422', 1), ('123456789', 1)]

预期输出:

[('0856547518', 1), ('1292058151', 2), ('2574529422', 2), ('2574529422', 1)]

标签: python

解决方案


如果您的每个元组的第一个值在您的示例中是唯一的,则可以将它们用作列表推导中的字典来获得结果:

l1 = [('0856547518', 2), ('1292058151', 5), ('2574529422', 3)]
l2 = [('0856547518', 1), ('1292058151', 3), ('2574529422', 1), ('123456789', 1)]

>>> [(k, dict(l1)[k]-dict(l2)[k]) if k in dict(l1) else (k, dict(l2)[k]) for k in dict(l2)]
[('0856547518', 1), ('1292058151', 2), ('2574529422', 2), ('123456789', 1)]

推荐阅读