我试图比较列表元组,并仅在第一个值匹配时减去第二个值对。在这个减法完成之后,我想保留不在列表中的元组。在本例中,我将保留('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)]
我必须重新安排一些事情才能使它工作。
我怀疑你有一些错误没有报告。
from itertools import zip_longest
ar = [('0856547518', 2), ('1292058151', 5), ('2574529422', 3)]
sr = [('0856547518', 1), ('1292058151', 3), ('2574529422', 1), ('2574529422', 1)]
def check(allc, stmt):
if allc is None:
return True
return allc[0] == stmt[0]
def make_tuple(allc, stmt):
if allc is None:
return stmt
return allc[0], allc[1] - stmt[1]
a = [make_tuple(allc, stmt) for allc,stmt in zip_longest(ar, sr) if check(allc, stmt)]
print(a)
按要求输出