【问题标题】:Get uncommon items between 2 lists获取 2 个列表之间的不常见项目
【发布时间】:2020-08-23 01:05:03
【问题描述】:

我有 2 个列表 'a1''a2':

a1 = [[1, 4], [1, 10], [2, 5], [2, 11], [3, 6], [4, 7], [4, 12], [5, 8], [5, 13], 
      [6, 9], [7, 14], [8, 15], [2, 10], [3, 11], [5, 12], [6, 13], [8, 14], [9, 15]]

a2 = [[1, 10], [2, 11], [4, 12], [5, 13], [7, 14], [8, 15], [2, 10], [3, 11], [5, 12], 
      [6, 13], [8, 14], [9, 15]]

我希望创建第三个列表,其中包含前两个列表之间的不常见元素,我应该有这样的东西。

[[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9]]

可以应用集差来提取第一个列表中不包含第二个的元素。

a3 = a1.difference(a2)

问题在于它适用于 2 个列表,而不适用于本例中的 2 个列表。

这种情况有有效的解决方案吗?最好的问候。

【问题讨论】:

  • IUC 和公认的答案解决了你的问题,uncommon elements between the 2 previous lists 不是你想要的

标签: python python-3.x list set-difference


【解决方案1】:
[x for x in a1 if x not in a2]

【讨论】:

    【解决方案2】:

    如果您将a1a2 定义为元组集,您的代码将起作用:

    a1 = {(1, 4), (1, 10), (2, 5), (2, 11), (3, 6), (4, 7), (4, 12), (5, 8), (5, 13), (6, 9), (7, 14), (8, 15), (2, 10), (3, 11), (5, 12), (6, 13), (8, 14), (9, 15)}
    a2 = {(1, 10), (2, 11), (4, 12), (5, 13), (7, 14), (8, 15), (2, 10), (3, 11), (5, 12), (6, 13), (8, 14), (9, 15)}
    a3 = a1.difference(a2)
    print(a3)
    

    【讨论】:

    • 其实是uncommon elements between the 2 previous lists,所以是对称的区别,而不是a1a2的区别
    【解决方案3】:

    您可以使用列表推导来检查来自a1 的元素是否存在于a2 的集合版本中。由于列表不可散列,我们可以使用元组代替。

    # Convert a2 elements to a set of tuples
    a2_set = {tuple(sublst) for sublst in a2}
    
    # Use a list comprehension to filter the elements from a1 that don't exist in a2
    difference = [sublst for sublst in a1 if tuple(sublst) not in a2_set]
    
    print(difference)
    

    输出:

    [[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9]]
    

    如果我们不关心顺序(集合是无序的),我们可以将a1a2 转换为元组集合,并使用a - ba.difference(b) 应用集合差异:

    print(a1_set - a2_set)
    # {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}
    
    print(a1_set.difference(a2_set))
    # {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}
    

    我们还可以使用列表推导将这些结果转换为嵌套列表:

    print([list(tup) for tup in a1_set - a2_set])
    # [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]
    
    print([list(tup) for tup in a1_set.difference(a2_set)])
    # [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]
    

    但是,如果您想要 symmetric difference,如文档中所述:

    返回一个新集合,其中包含集合中的元素或其他元素,但不能同时包含两者。

    我们可以使用a ^ ba.symmetric_difference(b) 来计算对称差:

    a1_set = {tuple(sublst) for sublst in a1}
    a2_set = {tuple(sublst) for sublst in a2}
    
    print(a1_set ^ a2_set)
    # {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}
    
    print(a1_set.symmetric_difference(a2_set))
    # {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}
    

    也可以使用列表推导从一组元组转换为嵌套:

    print([list(tup) for tup in a1_set ^ a2_set])
    # [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]
    
    print([list(tup) for tup in a1_set.symmetric_difference(a2_set)])
    # [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]
    

    【讨论】:

      【解决方案4】:

      我认为您可以在应用 difference 函数之前对列表执行此操作

      a1 = set(tuple(pair) for pair in a1)
      

      然后你就可以实现你想要的

      a3 = a1.difference(a2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-06
        • 2016-07-06
        • 2013-09-20
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        相关资源
        最近更新 更多