Seite 1 von 1

tuple auf gleiche Elemente überprüfen

Verfasst: Mittwoch 4. März 2009, 19:14
von Nocta
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.

Verfasst: Mittwoch 4. März 2009, 19:39
von cofi
Wenn du kein Set benutzen willst, warum sortierst du die Tupel nicht? Dann sollte es nur eine Möglichkeit geben.

Re: tuple auf gleiche Elemente überprüfen

Verfasst: Mittwoch 4. März 2009, 19:41
von numerix
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.
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.

Falls es auf die Performance nicht ankommt, ist die set() - sort() - Variante doch nicht schlecht.

Verfasst: Mittwoch 4. März 2009, 19:52
von Darii
Keine Ahnung wie deine Daten konkret aussehen, evtl geht

Code: Alles auswählen

all(element in tuple1 for element in tuple2)

Verfasst: Mittwoch 4. März 2009, 20:03
von Nocta
@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:

Code: Alles auswählen

if (j, i) not in list and (i, j) not in list
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

Verfasst: Mittwoch 4. März 2009, 20:10
von DasIch

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

Verfasst: Mittwoch 4. März 2009, 20:19
von Nocta
Danke, DasIch, ich konnte mit deiner Hilfe dann folgenden Code produzieren:

Code: Alles auswählen

if not sorted((i, j)) in [sorted(y) for y in [x for x in list]]
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.

Verfasst: Donnerstag 5. März 2009, 00:03
von EyDu

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

Verfasst: Donnerstag 5. März 2009, 13:35
von Nocta
@EyDu: Stimmt, da sieht man mal wieder, wie einfach das ganze in Python eigentlich ist ;)
Man muss nur die richtigen Funktionen benutzen.