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.