在Python中,您可以使用
有没有一种方法可以执行此操作的disjoint相反版本呢?即找到既不是
a.intersection(b)
来查找两个集合中共同的项。有没有一种方法可以执行此操作的disjoint相反版本呢?即找到既不是
a
又不是b
的项;将a
中独特的项与b
中独特的项合并。a.symmetric_difference(b)
来自set.symmetric_difference()
方法文档:
返回一个新的集合,其中包含集合或其他中的元素,但不包含两者都有的元素。
如果a
和b
都是集合,则也可以使用^
运算符:
a ^ b
set.symmetric_difference()
接受任何可迭代的 other 参数。
输出等同于 (a | b) - (a & b)
,即两个集合的并集减去交集。
生成输出需要 O(M+N) 的时间,其中 M 和 N 分别是集合 a
和 b
的长度;需要 M 步来复制集合 a
,然后需要 N 步来根据 b
中的每个值修改该集合:
def symmetric_difference(a, b):
result = set(a)
for elem in b:
try:
result.remove(elem)
except KeyError:
result.add(elem)
return result
也有原地变体,其中集合a
直接被修改;使用a.symmetric_difference_update(b)
或a ^= b
。原地变体需要O(N)时间,因此只取决于集合b
的大小:
def symmetric_difference_update(a, b):
for elem in b:
try:
a.remove(elem)
except KeyError:
a.add(elem)
# no return, a has been updated in-place
a={1,2,4,5,6}
b={5,6,4,9}
c=(a^b)&b
print(c) # you got {9}
b
和a
之间的(非对称)差异。这可以用更简单的表达式b - a
来表示!a ^ b
才是a
和b
的对称差异和真正的交集的反运算,结果应该是{1, 2, 9}
。 - Martijn Pietersa = [ 1,2,3,4]
b = [ 8,7,9,2,1]
c = [ element for element in a if element not in b]
d = [ element for element in b if element not in a]
print(c)
# output is [ 3,4]
print(d)
# output is [8,7,9]
您可以将这两个列表合并
a = [1,2,3,4]
b = [8,7,9,2,1]
c = []
def loop_to_check(e,f):
for i in range(len(e)):
if e[i] not in f:
c.append(e[i])
loop_to_check(a,b)
loop_to_check(b,a)
print(c)
## output is [3,4,8,7,9]
这个循环回到列表并返回不相交的列表
value in list
需要检查列表中的每个元素是否相等;对于长度为N和M的输入,这将花费O(MxN)的时间。另一方面,集合操作只需要O(M+N)的时间,其中K是两个集合中最短的长度。尝试在两个具有1000个元素的列表上使用它。再试试有10000个元素的列表。问题之所以问到集合,是有原因的。 - Martijn Pietersa = [1,2,3,4,5,6]
b = [2,3]
for i in b:
if i in a:
a.remove(i)
print(a)
输出结果为[1,4,5,6]
,希望它能正常工作。
a
,否则没有真正的后果)。此外,check = i in a
是多余的,因为你总是可以使用 if i in a:
。 - cowbertprint(sorted(set(a)-set(b)))
。 - ravibelia-b
和b-a
的并集。试着将7
添加到b
中,它将被包含在对称差中。 - Martijn Pieters
|
和&
通常是按位或和按位与,但是在集合上它们为您提供并集和交集。比较运算符<
,<=
,>
和>=
也已被重载。 - Martijn Pietersa
的项目”是正确的,这也是我立刻读到他们的方式。 - Kelly Bundy