我试着写一段代码,可以自动因素的表达式。 举例来说,如果我有两个列表[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中是否提供任何方便的功能,能做到这一点? 提前致谢!!
使用的对称差操作员set
S(又名XOR运算符):
>>> set([1,2,3]) ^ set([3,4,5])
set([1, 2, 4, 5])
您可以使用交集的概念来处理这类问题。
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元。
老问题,但看起来像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 ]
......这大概是因为在原来的问题,只有少许清洁剂所带来的相同的解决方案。 此方法将维持从原始列表重复但相当 (如多个数量级)较慢对于较大数据集。
您可以使用.__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)