繁体   English   中英

如何获得两元素子列表的两个列表之间的对称差异?

[英]How can the symmetric difference between two lists of two-element sublists be obtained?

我有两个列表,每个列表包含两个元素的列表。

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]

您可以从每个列表中创建一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']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM