如何在不使用“ |”的情况下将两组连接在一起


171

假定ST被分配了集合。不使用join运算符|,如何找到两个集合的并集?例如,找到交叉点:

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }

那么如何在不使用的情况下在一行中找到两个集合的并集|呢?


1
你需要工会吗?如果是,那么您可以做s.union(t)
Ansuman Bebarta

59
你为什么不能使用|
Scott Bartell 2014年

1
任何不使用的一般理由|
matanster

5
一个原因可能是将set操作作为函数参数传递。想象一下,一个功能,喜欢的东西:def apply_set_operation(a, b, set_operation)。当调用这个函数,我宁愿apply_set_operation(a, b, set.union)apply_set_operation(a, b, set.__or__)
BSA

Answers:


309

您可以对集合使用联合方法: set.union(other_set)

请注意,它会返回一个新集合,即不会对其自身进行修改。


54
但是,|可以修改内联变量:set_a |= set_b
jorgenkg

12
@jorgenkg与:相同set_a = set_a.union(set_b)。如果您的意思是“就地”,那么两者都不做,都会创建一个新的set
恰好是

3
@jorgenkg仍会创建一个新集合并替换引用。
Alvaro

3
@Alvaro @nitely根据一个简单的测试:a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a),@jorgenkg是正确的-变量a被内联修改。我想念什么吗?
johndodo

3
不,看起来不像:a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a)。即使a被摧毁,c也不会如此。另外,c现在是set([1, 2, 3, 4]),因此@jorgenkg的评论是正确的。
johndodo

45

您可以使用or_别名:

>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])

9
喜欢这种方法,更实用,可以应用于2套或更多套。
科林·苏

42

如果您可以修改原始集(在某些情况下可能需要这样做),可以使用set.update()

S.update(T)

返回值是None,但S将更新为原始S和的并集T


23

假设您也无法使用s.union(t),等于s | t,您可以尝试

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])

或者,如果您想理解,

>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])

14

如果加入表示您是工会,请尝试以下方法:

set(list(s) + list(t))

这有点骇人听闻,但我想不出更好的衬里来做。


如果您进行并集,则set(list(s)+ list(t))将为您提供相同的结果。
Ansuman Bebarta

我知道,但是看来他在尝试避免使用内置的python函数,否则他只会使用| 操作员。
BenjaminCohen

listset内置python函数
whackamadoodle3000 '18

10

假设您有2个清单

 A = [1,2,3,4]
 B = [3,4,5,6]

所以你可以找到A联盟B如下

 union = set(A).union(set(B))

另外,如果要查找相交和非相交,请按照以下步骤进行操作

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection

7

您可以像这样将两个集合解压缩成一个集合:

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

*解包集。拆包是将可迭代项(例如集合或列表)表示为它产生的每个项目的地方。这意味着上面的示例简化为{1, 2, 3, 4, 3, 4, 5, 6},然后简化为,{1, 2, 3, 4, 5, 6}因为该集合只能包含唯一项。


*第3行做什么?
altabq

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.