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


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.


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

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.


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

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.


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

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.


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.


Die Verwendung des Listenverständnisses für Nebenwirkungen und mit anonymen Parametern ist eine super schlechte Praxis.
Jean-François Fabre
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.