tuple auf gleiche Elemente überprüfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Mittwoch 4. März 2009, 19:14

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 4. März 2009, 19:39

Wenn du kein Set benutzen willst, warum sortierst du die Tupel nicht? Dann sollte es nur eine Möglichkeit geben.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 4. März 2009, 19:41

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Mittwoch 4. März 2009, 19:52

Keine Ahnung wie deine Daten konkret aussehen, evtl geht

Code: Alles auswählen

all(element in tuple1 for element in tuple2)
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Mittwoch 4. März 2009, 20:03

@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
DasIch
User
Beiträge: 2462
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 4. März 2009, 20:10

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
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Mittwoch 4. März 2009, 20:19

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.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 5. März 2009, 00:03

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.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Donnerstag 5. März 2009, 13:35

@EyDu: Stimmt, da sieht man mal wieder, wie einfach das ganze in Python eigentlich ist ;)
Man muss nur die richtigen Funktionen benutzen.
Antworten