如何在不使用"|"的情况下在一行中连接两个集合

fan*_*yst 146 python set

假设ST分配集.不使用join运算符|,如何找到两个集合的并集?例如,这可以找到交叉点:

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }
Run Code Online (Sandbox Code Playgroud)

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

ovr*_*ity 267

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

请注意,它返回一个新集,即它不会自行修改.

  • 但是,`|`可以修改内联变量:`set_a | = set_b` (44认同)
  • @jorgenkg与:`set_a = set_a.union(set_b)`相同.如果你的意思是"就地",那么两者都不会这样做,都会创造一个新的"集合" (8认同)
  • @jorgenkg它仍然创建一个新集并替换引用. (2认同)
  • @Alvaro @nitely根据一个简单的测试:`a = set((1,2,3,)); b = set((1,3,4,)); id_a = id(a); a | = b; 断言id_a == id(a)`,@ jogenkg是对的 - 变量`a`被内联修改.我错过了什么吗? (2认同)
  • 不,看起来不像:`a = set((1,2,3,)); b = set((1,3,4,)); c = a; a | = b; 断言id(c)== id(a)`.即使`a`被破坏,`c`也不会被破坏.另外,`c`现在是'set([1,2,3,4])`,所以@jorgenkg的评论是正确的. (2认同)

Ale*_*nko 40

你可以使用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])
Run Code Online (Sandbox Code Playgroud)

  • 喜欢这种方法,功能更强大,可以应用于2套或更多套. (9认同)

Max*_*cia 21

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

S.update(T)
Run Code Online (Sandbox Code Playgroud)

返回值是None,但S将更新为原始S和的联合T.


ars*_*jii 20

假设你也不能使用s.union(t),相当于s | t你可以试试

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要理解,

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


小智 16

您可以像这样将两组解包为一组:

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}
Run Code Online (Sandbox Code Playgroud)

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

  • 第 3 行中的“*”有什么作用? (2认同)

Ben*_*hen 14

如果加入你的意思是工会,试试这个:

set(list(s) + list(t))
Run Code Online (Sandbox Code Playgroud)

这有点像黑客,但我想不出更好的一个班轮来做到这一点.


iyo*_*shi 10

假设你有2个列表

 A = [1,2,3,4]
 B = [3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

所以你可以找到AUnion B如下

 union = set(A).union(set(B))
Run Code Online (Sandbox Code Playgroud)

如果你想找到交叉点和非交叉点,你也可以这样做

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection
Run Code Online (Sandbox Code Playgroud)


Vai*_*hra 5

你可以做union或简单列表理解

[A.add(_) for _ in B]
Run Code Online (Sandbox Code Playgroud)

A将拥有B的所有元素

  • 使用列表理解来消除副作用并使用匿名参数是非常糟糕的做法。 (2认同)