查找列表中的非公共元素(Find non-common elements in lists)

2019-06-26 02:00发布

我试着写一段代码,可以自动因素的表达式。 举例来说,如果我有两个列表[1,2,3,4]和[2,3,5],代码应该能够找到在两个列表中共同的元素,[2,3],并结合元件的其余部分一起在一个新的列表,作为[1,4,5]。

从这篇文章: 如何找到列表交集? 我看到共同的元素可以通过发现

set([1,2,3,4]&set([2,3,5]). 

有没有一种简单的方法来检索每个列表非共同的元素,在我的例子是[1,4]和[5]

我可以继续做一个for循环:

lists = [[1,2,3,4],[2,3,5]]
conCommon = []
common = [2,3]
for elem in lists:
    for elem in eachList:
    if elem not in common:
        nonCommon += elem

但是,这似乎是多余和低效。 Python中是否提供任何方便的功能,能做到这一点? 提前致谢!!

Answer 1:

使用的对称差操作员set S(又名XOR运算符):

>>> set([1,2,3]) ^ set([3,4,5])
set([1, 2, 4, 5])


Answer 2:

您可以使用交集的概念来处理这类问题。

b1 = [1,2,3,4,5,9,11,15]
b2 = [4,5,6,7,8]
set(b1).intersection(b2)
Out[22]: {4, 5}

有关使用该代码的最好的事情是它适用于大数据也非常快。 我有B1与607139和b2与当我使用这个逻辑,我得到我的结果2.9秒296029元。



Answer 3:

老问题,但看起来像Python有一个内置的功能,能够为你在寻找什么: .difference()

list_one = [1,2,3,4]
list_two = [2,3,5]

one_not_two = set(list_one).difference(list_two)
# set([1, 4])

two_not_one = set(list_two).difference(list_one)
# set([5])

这也可以写成:

one_not_two = set(list_one) - set(list_two)

定时

我跑在两个一些定时测试和似乎.difference()具有轻微的边缘,到10调- 15%,但每个方法花费约一秒的第八过滤1M项目(500和100000之间的随机整数) ,所以,除非你是非常敏感的时间,它可能是无关紧要的。

其他注意事项

它出现在OP正在寻找的是提供两个单独的列表(或套)中的溶液 - 酮,其中第一包含不在第二项,并且反之亦然。 大部分以前的答案返回一个列表或集,其中包括所有的项目。

还有关于可能在第一个列表复制项目是否应该被重复计算,或只有一次的问题。

如果OP想要保持重复,列表理解可以使用,例如:

one_not_two = [ x for x in list_one if x not in list_two ]
two_not_one = [ x for x in list_two if x not in list_one ]

......这大概是因为在原来的问题,只有少许清洁剂所带来的相同的解决方案。 此方法将维持从原始列表重复但相当 (如多个数量级)较慢对于较大数据集。



Answer 4:

您可以使用.__xor__属性的方法。

set([1,2,3,4]).__xor__(set([2,3,5]))

要么

a = set([1,2,3,4])
b = set([2,3,5])
a.__xor__(b)


文章来源: Find non-common elements in lists