So verbinden Sie zwei Sätze in einer Zeile, ohne "|"

171

Nehmen Sie an, dass Sund TSätze zugewiesen sind. |Wie kann ich ohne Verwendung des Join-Operators die Vereinigung der beiden Mengen finden? Dies findet zum Beispiel den Schnittpunkt:

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

Wie kann ich also die Vereinigung zweier Sätze in einer Zeile finden, ohne sie zu verwenden |?

Fandyst
quelle
1
Müssen Sie sich gewerkschaftlich organisieren? Wenn ja, dann können Sie an Union (t)
Ansuman Bebarta
59
Warum kannst du nicht benutzen |?
Scott Bartell
1
Gibt es einen generischen Grund, nicht zu verwenden |?
Matanster
5
Ein Grund könnte darin bestehen, eine Set-Operation als Funktionsargument zu übergeben. Stellen Sie sich eine Funktion vor, etwa : def apply_set_operation(a, b, set_operation). Beim Aufruf dieser Funktion, würde ich es vorziehen , apply_set_operation(a, b, set.union)zuapply_set_operation(a, b, set.__or__)
bsa

Antworten:

309

Sie können die Vereinigungsmethode für Mengen verwenden: set.union(other_set)

Beachten Sie, dass ein neuer Satz zurückgegeben wird, dh er ändert sich nicht selbst.

Übergewicht
quelle
54
Allerdings |kann ändern die Variable inline:set_a |= set_b
jorgenkg
12
@jorgenkg wie : set_a = set_a.union(set_b). Wenn Sie "an Ort und Stelle" meinen, wird keiner das tun, beide erstellen einen neuenset
endlich
3
@jorgenkg Es wird immer noch ein neuer Satz erstellt und die Referenz ersetzt.
Alvaro
3
@Alvaro @nitely nach einem einfachen Test : a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a), @jorgenkg ist richtig - Variable awird inline geändert. Vermisse ich etwas
Johndodo
3
Nein, sieht nicht so aus : a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). Selbst wenn aes zerstört worden cwäre , wäre es nicht gewesen. Auch cist jetzt set([1, 2, 3, 4]), also ist @ jorgenkgs Kommentar korrekt.
Johndodo
45

Sie könnten einen or_Alias ​​verwenden:

>>> 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
quelle
9
Ich liebe diesen Ansatz, funktionaler und kann auf 2 oder mehr Sets angewendet werden.
Colin Su
41

Wenn Sie mit dem Ändern des Originalsatzes zufrieden sind (was Sie in einigen Fällen möglicherweise tun möchten), können Sie Folgendes verwenden set.update():

S.update(T)

Der Rückgabewert ist None, Swird aber aktualisiert, um die Vereinigung des Originals Sund zu sein T.

Max Candocia
quelle
23

Angenommen, Sie können auch nicht verwenden s.union(t), was gleichbedeutend ist s | t, könnten Sie es versuchen

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

Oder wenn Sie ein Verständnis wollen,

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

Wenn Sie mit Beitritt Gewerkschaft meinen, versuchen Sie Folgendes:

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

Es ist ein bisschen wie ein Hack, aber ich kann mir keinen besseren Einzeiler dafür vorstellen.

BenjaminCohen
quelle
set (Liste (n) + Liste (t)) gibt Ihnen das gleiche Ergebnis, wenn Sie eine Vereinigung durchführen.
Ansuman Bebarta
Ich bin mir bewusst, aber es sieht so aus, als hätte er versucht, die Verwendung integrierter Python-Funktionen zu vermeiden, sonst hätte er nur die | verwendet Operator.
BenjaminCohen
listund setsind in Python-Funktionen gebaut
whackamadoodle3000
10

Angenommen, Sie haben 2 Listen

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

So finden Sie AUnion Bwie folgt

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

Auch wenn Sie Schnittpunkte und Nichtkreuzungen suchen möchten, gehen Sie wie folgt vor

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

Sie können einfach beide Sets wie folgt in eines auspacken:

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

Das *packt das Set aus. Beim Auspacken wird ein iterierbares Element (z. B. ein Satz oder eine Liste) als jedes Element dargestellt, das es ergibt. Dies bedeutet, dass das obige Beispiel vereinfacht und {1, 2, 3, 4, 3, 4, 5, 6}dann vereinfacht wird, {1, 2, 3, 4, 5, 6}da das Set nur eindeutige Elemente enthalten kann.

Jamie Saunders
quelle
Was macht das *in Zeile 3?
Altabq
5

Sie können tun unionoder einfach Listenverständnis

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

A hätte alle Elemente von B.

Vaibhav Mishra
quelle
Die Verwendung des Listenverständnisses für Nebenwirkungen und mit anonymen Parametern ist eine super schlechte Praxis.
Jean-François Fabre