我有两个列表,每个列表都包含两个元素列表。
a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']]
b = [['Rudolf', '40'], ['Adolf', '50']]
我希望根据子列表的“关键”第一个元素获得两个列表的“对称差异”。
这种“对称差异”如下:
c = [['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']]
因此,“Adolf”条目已被删除,因为它们存在于两个列表中,而其他条目(包括“Rudolf”条目)已被包括在内,因为它们不在两个列表中。
另一个例子如下:
a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']]
b = [['Heinrich', '25']]
c = [['Adolf', '10'], ['Hermann', '20']]
我觉得这必须通过一些聪明的列表理解来实现,但我不太确定如何处理它。
c = [x for x in a_pairs if x not in b_pairs]
答案 0 :(得分:5)
您可以从每个列表中创建set
个名称(第一个元素),然后使用^
来获取名称集的对称差异。然后使用列表推导迭代每个列表并检查名称是否在唯一集合中,然后添加这两个列表推导的结果。
def getDifference(x,y):
symDiff = set(i[0] for i in x) ^ set(i[0] for i in y)
return [i for i in x if i[0] in symDiff] + [i for i in y if i[0] in symDiff]
第一个例子
>>> a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']]
>>> b = [['Rudolf', '40'], ['Adolf', '50']]
>>> getDifference(a,b)
[['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']]
第二个例子
>>> a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']]
>>> b = [['Heinrich', '25']]
>>> getDifference(a,b)
[['Adolf', '10'], ['Hermann', '20']]