【问题标题】:How can the symmetric difference between two lists of two-element sublists be obtained?如何获得两元素子列表的两个列表之间的对称差?
【发布时间】:2015-02-03 22:57:21
【问题描述】:

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

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]

【问题讨论】:

    标签: python list set list-comprehension difference


    【解决方案1】:

    您可以从每个列表中创建一个名称(第一个元素)的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']]
    

    【讨论】:

    • 这很棒。非常感谢您的帮助。我不知道集合的漂亮功能!
    • 顺便说一句,symmetric_difference() 也是set method。如果设置了ab,则可以通过a.symmetric_difference(b)b.symmetric_difference(a) 返回对称差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2022-07-23
    • 2020-02-09
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多