Comment joindre deux ensembles en une seule ligne sans utiliser «|»

171

Supposons que Set Tsont assignés des ensembles. Sans utiliser l'opérateur de jointure |, comment puis-je trouver l'union des deux ensembles? Ceci, par exemple, trouve l'intersection:

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

Alors, comment puis-je trouver l'union de deux ensembles sur une ligne sans utiliser |?

fandyste
la source
1
avez-vous besoin d'union? Si oui, vous pouvez faire s.union (t)
Ansuman Bebarta
59
Pourquoi ne pouvez-vous pas utiliser |?
Scott Bartell
1
Une raison générique de ne pas utiliser |?
matanster
5
Une des raisons pourrait être de passer une opération set comme argument de fonction. Imaginez une fonction, quelque chose comme: def apply_set_operation(a, b, set_operation). Lorsque vous appelez cette fonction, je préfère apply_set_operation(a, b, set.union)àapply_set_operation(a, b, set.__or__)
bsa

Réponses:

309

Vous pouvez utiliser la méthode d'union pour les ensembles: set.union(other_set)

Notez qu'il renvoie un nouvel ensemble c'est-à-dire qu'il ne se modifie pas.

ovrwngtvity
la source
54
Cependant, vous |pouvez modifier la variable en ligne:set_a |= set_b
jorgenkg
13
@jorgenkg même que: set_a = set_a.union(set_b). Si vous voulez dire "sur place", aucun des deux ne le fera, les deux créent un nouveauset
nitely
3
@jorgenkg crée toujours un nouvel ensemble et remplace la référence.
Alvaro
3
@Alvaro @nately selon un test simple a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a):, @jorgenkg a raison - la variable aest modifiée en ligne. Est-ce que je manque quelque chose?
johndodo
3
Nope, ne ressemble pas: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). Même si elle aavait été détruite, elle cn'aurait pas été. Aussi, cc'est maintenant set([1, 2, 3, 4]), donc le commentaire de @ jorgenkg est correct.
johndodo
45

Vous pouvez utiliser un or_alias:

>>> 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])
Alexander Klimenko
la source
9
J'adore cette approche, plus fonctionnelle, et pourrait être appliquée à 2 ou plusieurs ensembles.
Colin Su
42

Si vous acceptez de modifier l'ensemble d'origine (ce que vous voudrez peut-être faire dans certains cas), vous pouvez utiliser set.update():

S.update(T)

La valeur de retour est None, mais Ssera mise à jour pour être l'union de l'original Set T.

Max Candocia
la source
23

En supposant que vous ne pouvez pas non plus utiliser s.union(t), ce qui équivaut à s | t, vous pouvez essayer

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

Ou, si vous voulez une compréhension,

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

Si par adhésion vous entendez union, essayez ceci:

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

C'est un peu un hack, mais je ne peux pas penser à une meilleure doublure pour le faire.

BenjaminCohen
la source
set (list (s) + list (t)) vous donnera le même résultat si vous faites une union.
Ansuman Bebarta
Je suis au courant, mais il semble qu'il essayait d'éviter d'utiliser des fonctions python intégrées, sinon il aurait simplement utilisé le | opérateur.
BenjaminCohen
listet setsont construits dans des fonctions python
whackamadoodle3000
10

Supposons que vous ayez 2 listes

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

afin que vous puissiez trouver AUnion Bcomme suit

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

aussi si vous voulez trouver une intersection et une non-intersection, procédez comme suit

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection
iyogeshjoshi
la source
7

Vous pouvez simplement décompresser les deux ensembles en un seul comme ceci:

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

Le *déballe l'ensemble. Le déballage est l'endroit où un itérable (par exemple un ensemble ou une liste) est représenté comme chaque élément qu'il produit. Cela signifie que l'exemple ci-dessus simplifie {1, 2, 3, 4, 3, 4, 5, 6}ce qui se simplifie ensuite {1, 2, 3, 4, 5, 6}car l'ensemble ne peut contenir que des éléments uniques.

Jamie Saunders
la source
Que fait la *ligne 3?
altabq le
5

Vous pouvez faire unionou simple compréhension de liste

[A.add(_) for _ in B]

A aurait tous les éléments de B

Vaibhav Mishra
la source
utiliser la compréhension de liste pour les effets secondaires et avec des paramètres anonymes est une très mauvaise pratique.
Jean-François Fabre