我正在尝试编写一段可自动计算表达式的代码。例如, 如果我有两个列表[1,2,3,4]和[2,3,5],代码应该能够找到两个列表中的公共元素,[2,3],并结合其余的元素汇总在一个新的列表中,为[1,4,5]。
从这篇文章:How to find list intersection? 我看到可以通过
找到共同的元素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是否提供了可以做到的任何方便的功能?在此先感谢!!
答案 0 :(得分:47)
对set
s(也称为XOR运算符)使用对称差分运算符:
>>> set([1,2,3]) ^ set([3,4,5])
set([1, 2, 4, 5])
答案 1 :(得分:12)
您可以使用交叉概念来处理这类问题。
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和296029元素我在2.9秒内获得了我的结果。
答案 2 :(得分:1)
古老的问题,但看起来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%,但是每种方法大约需要八分之一秒才能过滤100万个项目( 500和100,000),因此除非您非常对时间敏感,否则它可能无关紧要。
其他说明
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 ]
...这与原始问题中提出的解决方案大致相同,只是稍微清洁了一点。此方法将保留原始列表中的重复项,但对于较大的数据集,相当(类似于多个数量级),速度较慢。
答案 3 :(得分:0)
您可以使用 <Text>{this.props.match.params.imageId}</Text>
属性方法。
.__xor__
或
set([1,2,3,4]).__xor__(set([2,3,5]))
答案 4 :(得分:0)
这应该获得通用元素和剩余元素
lis1=[1,2,3,4,5,6,2,3,1]
lis2=[4,5,8,7,10,6,9,8]
common = list(dict.fromkeys([l1 for l1 in lis1 if l1 in lis2]))
remaining = list(filter(lambda i: i not in common, lis1+lis2))
common = [4, 5, 6]
remaining = [1, 2, 3, 2, 3, 1, 8, 7, 10, 9, 8]
答案 5 :(得分:0)
您可以使用symmetric_difference命令
x = {1,2,3} y = {2,3,4}
z = set.difference(x,y)
输出将为:z = {1,4}
答案 6 :(得分:0)
所有好的解决方案,从基本的 DSA 风格到使用内置函数:
# Time: O(2n)
def solution1(arr1, arr2):
map = {}
maxLength = max(len(arr1), len(arr2))
for i in range(maxLength):
if(arr1[i]):
if(not map.get(arr1[i])):
map[arr1[i]] = [True, False]
else:
map[arr1[i]][0] = True
if(arr2[i]):
if(not map.get(arr2[i])):
map[arr2[i]] = [False, True]
else:
map[arr2[i]][1] = False
res = [];
for key, value in map.items():
if(value[0] == False or value[1] == False):
res.append(key)
return res
def solution2(arr1, arr2):
return set(arr1) ^ set(arr2)
def solution3(arr1, arr2):
return (set(arr1).difference(arr2), set(arr2).difference(arr1))
def solution4(arr1, arr2):
return set(arr1).__xor__(set(arr2))
print(solution1([1,2,3], [2,4,6]))
print(solution2([1,2,3], [2,4,6]))
print(solution3([1,2,3], [2,4,6]))
print(solution4([1,2,3], [2,4,6]))