Vergleich von 2 Listen

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.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

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.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

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
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

'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).
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.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

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...
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

@ BlackJack:

Ja, dachte die Elemente sind Zahlen, deshalb verstehe ich das ganze auch nicht so genau
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.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

gut, ex1 ist ein Tupel...
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

allerdings kann ich in der for-Schleife dann auch nicht sagen:

for ex1[0] in ...
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

und wie wäre es mit

Code: Alles auswählen

 xxx[ex1[0]] 
?
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

nein, dann Fehlermeldung: too many values to unpack
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

@ BlackJack: Wie kann ich aus meinen Paaren ein Dictionary erzeugen?
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.
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

@BlackJack also ihr habt Ansprüche an eine blutige Anfängerin :-)
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

ganz ehrlich: ich habe absolut keine Ahnung, was ich machen muss :-(
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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?
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

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...
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

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


Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

ich bin schon froh, dass mir überhaupt wer antwortet... :-)
Antworten