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?
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, 1, 2)
und (1, 2)
würden nach der Konvertierung in set
gleich werden.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))
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)}
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.
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)}