Seite 1 von 2

Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 07:54
von Michi_J
Hallo,

ich habe mal wieder ein Problem und hoffe, dass mir jemand helfen kann. Es geht darum, dass ich 2 Listen vergleichen will: In einer Liste (Listenpaar) habe ich Zahlenwerte einer anderen Zahl zugeordnet Bsp [6 0], [14 1], [2 2] [28 3] usw. und ich habe eine zweite Liste, die aber nicht gleich lang ist wie die erste, und möchte die beiden Listen vergleichen: Wenn ein Eintrag aus der 2. Liste gleich ist mit dem 0. Eintrag eines Tupels aus der 1. Liste, dann soll der Wert aus der 2. Liste mit dem 1. Eintrag des Tupels ersetzt werden...

Ich hab einen Code geschrieben, aber er funktioniert nicht. Folgende Fehlermeldung im Traceback: Kann mir jemand sagen, worin der Fehler liegt?

Code: Alles auswählen


ex1=0
for ex1 in listenpaar:
    ex2=0
    for ex2 in external_faces2:
        if listenpaar[ex1][0] == external_faces2[ex2]:
            external_faces2[ex2]=listenpaar[ex1][1]
        else:
            pass
        ex2=ex2+1
    ex1=ex+1


Danke.

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 07:57
von Michi_J
Traceback:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Michi\Eigene Dateien\TUM\Master - GIS Projekt\Aufgaben\test_faces_count14.py", line 186, in <module>
if listenpaar[ex1][0] == external_faces2[ex2]:
TypeError: list indices must be integers

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:03
von Pekh
'external_faces2' enthält vermutlich keine Integer, sondern irgendwelche anderen Objekte. Genau diese bindest du aber an den Namen 'ex2'. Anders gesagt: Du kannst 'ex2' nicht dazu verwenden, auf Elemente der Liste zuzugreifen, weil 'ex2' bereits ein Element der Liste ist (und wahrscheinlich sogar das, was du haben willst).

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:05
von BlackJack
@Michi_J: Die Fehlermeldung sagt es doch eigentlich schon sehr deutlich: Indexe in Listen müssen ganze Zahlen sein. Wenn Du so etwas bekommst, solltest Du schauen, was in der beanstandeten Programmzeile steht. Und solltest Du Dir ausgeben lassen, mit was Du versuchst als Index auf Listenelemente zuzugreifen. Du denkst ja anscheinend das *sind* Zahlen, also solltest Du diese Annahme überprüfen.

Der Versuch Laufvariablen innerhalb von ``for``-Schleifen selbst hochzuzählen ist übrigens sinnlos. Die Zuweisung an `ex1` vor den Schleifen und das Erhöhen von `ex1` und `ex2` an den Schleifenenden machen keinen Sinn, weil die Namen vor dem nächsten Schleifendurchlauf an den nächsten Wert aus dem jeweiligen "iterable" gebunden werden.

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:10
von Michi_J
ja, alle Elemente kommen schon vor:

die Listen sind folgene:

external_faces2: [0, 2, 2, 14, 4, 0, 14, 50, 44, 4, 50, 52, 52, 82, 82, 88, 88, 102, 102, 44]

listenpaare: [[6, 0], [14, 1], [2, 2], [6, 0], [6, 0], [50, 3], [6, 0], [28, 4], [2, 2], [28, 4], [28, 4], [40, 5], [2, 2], [40, 5], [0, 6], [40, 5], [40, 5], [4, 7], [44, 8], [40, 5], [52, 9], [6, 0], [6, 0], [60, 10], [60, 10], [28, 4], [60, 10], [68, 11], [68, 11], [28, 4], [40, 5], [68, 11], [44, 8], [68, 11], [82, 12], [6, 0], [88, 13], [6, 0], [60, 10], [88, 13], [88, 13], [68, 11], [102, 14], [68, 11]]

jetzt soll durch die Liste external_faces2 durchgegangen werde und geschaut werden, welcher Wert in der Liste Listenpaare der Wert entspricht (Bsp. 0 aus external faces2 --> [0, 6] in listenpaar) also soll in der external_faces Liste die 0 durch eine 6 ersetzt werden...

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:12
von Michi_J
@ BlackJack:

Ja, dachte die Elemente sind Zahlen, deshalb verstehe ich das ganze auch nicht so genau

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:14
von BlackJack
@Michi_J: Die Elemente in `listenpaare` sind ja nun ganz offensichtlich keine Zahlen. Was denkst Du denn was in jedem Schleifendurchlauf an `ex1` gebunden wird? Und hast Du es schon mit der Realität überprüft?

Edit: Dein Algorithmus wird übrigens quadratische Laufzeit haben -- Du solltest lieber am Anfang ein Dictionary aus den Paaren machen und dann nur *einmal* über die `external_faces` iterieren und Anhand des Dictionaries die entsprechenden Ersetzungen machen. Und ich würde nicht die Liste verändern, sondern eine neue mit dem Ergebnis erstellen.

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:15
von Pekh
Gib dir mal mittels print den jeweiligen Wert von 'ex1' aus und überlege, warum das kein Integer ist. Und ob du vielleicht falsch geklammert hast.

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:20
von Michi_J
gut, ex1 ist ein Tupel...

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:21
von Michi_J
allerdings kann ich in der for-Schleife dann auch nicht sagen:

for ex1[0] in ...

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:27
von Pekh
und wie wäre es mit

Code: Alles auswählen

 xxx[ex1[0]] 
?

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:31
von Michi_J
nein, dann Fehlermeldung: too many values to unpack

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:35
von Michi_J
@ BlackJack: Wie kann ich aus meinen Paaren ein Dictionary erzeugen?

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:37
von BlackJack
@Michi_J: Das sollst Du nicht in die ``for``-Schleife schreiben…

Geh das am besten mal Schritt für Schritt auf Papier durch bevor Du es in Quelltext fasst.

Wobei "tupel unpacking" an sich vielleicht auch eine gute Idee ist -- Du kannst in der äusseren ``for``-Schleife die beiden Zahlen auch gleich an sprechende Bezeichner binden statt da später mit den Indizes 0 und 1 drauf zuzugreifen. `new` und `old` würden sich vielleicht anbieten.

Aber wie schon gesagt: So ein Algorithmus mit quadratischer Laufzeit ist eh unschön. Schau mal was die `dict()`-Funktion an Argumenten entgegennehmen kann und was Generatorausdrücke sind.

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:39
von Michi_J
@BlackJack also ihr habt Ansprüche an eine blutige Anfängerin :-)

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:49
von Michi_J
ganz ehrlich: ich habe absolut keine Ahnung, was ich machen muss :-(

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:57
von Pekh
Erst einmal sorgen wir dafür, daß dein bisheriger Code läuft und du verstehst, warum er bisher nicht gelaufen ist. Dann können wir uns an Generatoren wagen.

Wie sieht denn dein Code im Augenblick aus?

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:58
von Michi_J
ich weiß, das klingt jetzt vielleicht etwas dreist und vor allem hilflos, aber kann mir jemand sagen, wie mein Quellcode dann schlussendlich auszusehen hat? Dann kann ich ihn einfacher nachvollziehen, weil im Moment blicke ich wirklich noch nicht durch...

Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 08:59
von Michi_J
im Augenblick sieht mein Code wie folgt aus:

Code: Alles auswählen


ex1=0
ex2=0
for [ex1[0]] in listenpaar:
    old=listenpaar.index(ex1)
    print old
    for ex2 in external_faces2:
        print "ex1 = " + str(ex1)
        print "ex2 = " + str(ex2)
        if listenpaar[ex1][0] == external_faces2[ex2]:
            external_faces2[ex2]=listenpaar[ex1][1]
        else:
            pass



Re: Vergleich von 2 Listen

Verfasst: Donnerstag 19. August 2010, 09:00
von Michi_J
ich bin schon froh, dass mir überhaupt wer antwortet... :-)