it-swarm.com.de

Effiziente Methode zum Erstellen eines Tupelsatzes, bei dem die Reihenfolge des Tuples keine Rolle spielt

Ich möchte eine Reihe von Tupeln erstellen, in denen die Reihenfolge der Tupel keine Rolle spielen sollte. Zum Beispiel: Wenn die Tupel, die ich hinzufügen möchte,

[(1,2),(1,3),(2,1)]

Es sollte so ausgegeben werden:

{(1,2),(1,3)}

Gibt es einen effizienten Weg, dies in Python zu tun?

17
shivank01

Sie können sorted und dann Tuple anwenden, gefolgt von der Konvertierung in set:

res = set(map(Tuple, map(sorted, L)))

print(res)

{(1, 2), (1, 3)}

Erklärung

Es gibt einige gute Gründe, warum Sie nicht jeden Tuple als ersten Schritt in set konvertieren sollten:

  1. Die Beispiele (1, 1, 2) und (1, 2) würden nach der Konvertierung in set gleich werden.
  2. Selbst wenn wir Tupel der Länge 2 in Betracht ziehen, fügen wir die Annahme hinzu, dass Tuple({(1, 2)}) und Tuple({(2, 1)}) gleich sind. Dies mag zwar zutreffen, würde aber als Implementierungsdetail angesehen, da set als ungeordnet betrachtet wird.

Funktionszusammenstellung

Die Funktionszusammenstellung ist nicht in Python enthalten, aber wenn Sie Zugriff auf die Bibliothek des Drittanbieters toolz haben, können Sie geschachtelte map vermeiden:

from toolz import compose

tup_sort = compose(Tuple, sorted)

res = set(map(tup_sort, L))
11
jpp

Sie können die Tupel sortieren:

l = [(1,2),(1,3),(2,1)]
res = set(map(lambda x: Tuple(sorted(x)), l))
print(res)
{(1, 2), (1, 3)}
2
Netwave

Der andere antwortet alle Arbeit! Ich werde nur meine hier posten, weil ich ein Anfänger bin und gerne übe.

mainSet = set()
l = [(1,2),(1,3),(2,1)]

for i in l:

    if Tuple(sorted(i)) not in mainSet:

        mainSet.add(Tuple(sorted(i)))

print(mainSet)

Gibt zurück

{(1, 2), (1, 3)}

Ob Sie dies nutzen wollen oder nicht, liegt ganz bei Ihnen! Die anderen Antworten sind viel kürzer.

1

Sie können auch Verständnis verwenden:

l=[(1, 2), (1, 3), (2, 1)]
res={ Tuple(sorted(t)) for t in l }
print(res)
{(1, 2), (1, 3)}
0
kantal