python - 比较两个不均匀的列表元组
问题描述
我试图比较列表元组并仅在第一个值匹配时减去第二个值对。减法完成后,我想保留不在列表中的元组。在这种情况下,我会保留 ('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)]
解决方案
如果您的每个元组的第一个值在您的示例中是唯一的,则可以将它们用作列表推导中的字典来获得结果:
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)]