Hallo.
Ich will ein paar Werte (genauer gesagt Tupel) in einer Liste hinzufügen, falls dieser Wert noch nicht in der Liste vorkommt. Allderdings ist ja (1,2) ungleich (2,1), aber für mich macht das keinen Unterschied. Wie kann man das ganze bequem lösen, ohne alle Permutationen des Tupels zu überprüfen?
Der typ set könnte das ja, aber ich will die Werte auch nicht als set speichern (wobei das Sortieren im nachhinein auch wieder möglich wär, nur gibt es bestimmt elaganteres ).
Danke schonmal für eure Antworten.
tuple auf gleiche Elemente überprüfen
Ist vielleicht jetzt keine Hilfe, aber ich habe es in solchen Fällen schon erlebt, dass ich bei vernünftiger Analyse des Datenmaterials festgestellt habe, dass ich den produzierenden Algorithmus so verändern kann, dass das Problem erst gar nicht auftritt.Nocta hat geschrieben:Hallo.
Ich will ein paar Werte (genauer gesagt Tupel) in einer Liste hinzufügen, falls dieser Wert noch nicht in der Liste vorkommt. Allderdings ist ja (1,2) ungleich (2,1), aber für mich macht das keinen Unterschied. Wie kann man das ganze bequem lösen, ohne alle Permutationen des Tupels zu überprüfen?
Der typ set könnte das ja, aber ich will die Werte auch nicht als set speichern (wobei das Sortieren im nachhinein auch wieder möglich wär, nur gibt es bestimmt elaganteres ).
Danke schonmal für eure Antworten.
Falls es auf die Performance nicht ankommt, ist die set() - sort() - Variante doch nicht schlecht.
Keine Ahnung wie deine Daten konkret aussehen, evtl geht
Code: Alles auswählen
all(element in tuple1 for element in tuple2)
@cofi: Tupel sind doch unveränderbar, also kann ich das wohl kaum sortieren. Allerdings könnte ich die Werte des Tupels sortieren, bevor ich sie als Tupel abspeicher. Nur ist das auch wieder ein umständlicher Ausdruck, weil list.sort() NoneType liefert und ich dann zwischenspeichern müsste etc.
@numerix: Ist nicht gerade ein komplexer Algorithmus, ich frag auch weniger, des Algorithmus' wegen, sondern eher, weil sich mir beim Schreiben die Frage aufgeworfen hat. In meinem kleinem Programm speziell sind's nur 2 Werte, die im Tupel stehen, da hab ich einfach (i, j) und (j, i) jeweils einzeln geprüft. Nur macht das bei 3 Elementen schon kein Spaß mehr
Auf Performance kommt's eigentlich auch nicht an. Ich dachte nur, es gibt vielleicht einen simplen, genialen Trick, das ganze in einem Ausdruck ganz einfach zu bewerkstelligen.
@Darii: Eigentlich ist es nur folgendes:
Vielleicht lässt sich ja echt was mit Generator Expressions/List Comprehensions machen, daran hab ich zB auch nicht gedacht, obwohl das nach den ganzen SPOJ-Threads hier im Forum das einzige sein sollte, was mir einfallen müsste, wenn ich darüber nachdenke, ein Problem mit listenähnlichen Objekten zu lösen :p
@numerix: Ist nicht gerade ein komplexer Algorithmus, ich frag auch weniger, des Algorithmus' wegen, sondern eher, weil sich mir beim Schreiben die Frage aufgeworfen hat. In meinem kleinem Programm speziell sind's nur 2 Werte, die im Tupel stehen, da hab ich einfach (i, j) und (j, i) jeweils einzeln geprüft. Nur macht das bei 3 Elementen schon kein Spaß mehr
Auf Performance kommt's eigentlich auch nicht an. Ich dachte nur, es gibt vielleicht einen simplen, genialen Trick, das ganze in einem Ausdruck ganz einfach zu bewerkstelligen.
@Darii: Eigentlich ist es nur folgendes:
Code: Alles auswählen
if (j, i) not in list and (i, j) not in list
Code: Alles auswählen
In [1]: sorted(('c', 'b', 'a'))
Out[1]: ['a', 'b', 'c']
In [2]: (1, 2) in map(lambda x: tuple(sorted(x)), [(2, 1)])
Out[2]: True
Danke, DasIch, ich konnte mit deiner Hilfe dann folgenden Code produzieren:
Sowas hab ich gesucht.
Edit: Somit ist auch mein Argument gegen cofi's Vorschlag, nämlich dass es sich durch den Rückgabetyp 'NoneType' bei list.sort() nicht knapp in einen Ausdruck schreiben lässt, auch widerlegt, ich hab nicht an sorted() gedacht.
Code: Alles auswählen
if not sorted((i, j)) in [sorted(y) for y in [x for x in list]]
Edit: Somit ist auch mein Argument gegen cofi's Vorschlag, nämlich dass es sich durch den Rückgabetyp 'NoneType' bei list.sort() nicht knapp in einen Ausdruck schreiben lässt, auch widerlegt, ich hab nicht an sorted() gedacht.
Code: Alles auswählen
>>> a = [(1,2), (2,3), (3,4)]
>>> set((1,2)) in map(set, a)
True
>>> set((4,5)) in map(set, a)
False
>>>
Das Leben ist wie ein Tennisball.