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 |?


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.


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])

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.


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])

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.


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

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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.