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

ja, ef ist jetzt draußen, war mein Fehler :-) - wie alles andere auch.

Code: Alles auswählen


for suchwert, zielwert in listenpaar:
    for index, ex2 in enumerate(external_faces2):
        if suchwert in external_faces2:
            #for index, ex2 in enumerate(external_faces2):
            external_faces2[index]=zielwert
                
print external_faces2


ich glaube so wäre die doppelte Schleife gelöst...
aber sieht immer nocht komisch aus :-)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Naja, im Rahmen deiner augenblicklichen Möglichkeiten wäre das aber die Lösung. Auf die problematische, quadratische Laufzeit hat dich Blackjack ja schon angesprochen. Bei der Vergabe von Namen solltest du dich an die Konventionen halten, wie sie z.B. in PEP 8 beschrieben werden.

Ein etwas schönerer Ansatz (im Hinblick auf die Laufzeit), der allerdings nicht die bestehende Liste verändert, sondern eine neue erzeugt:

Code: Alles auswählen

replacement_map = dict(Listenpaare) # Besser: Gleich als Dictionary anlegen und 1:1 Zuordnungen rausnehmen
neue_liste = []
for wert in external_faces2:
    if wert in replacement_map:
        neue_liste.append(replacement_map[wert])
    else:
        neue_liste.append(wert)

print neue_liste
# ggf. external_faces2 = neue_liste[:]
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

replacement_map[wert] ist somit der "Zielwert" von vorhin, wenn ich das richtig sehe?
und über dict(listenpaar) wird die Liste in ein Dictionary umgewandelt, wobei der erste Eintrag immer der "Key" ist und der 2. der Wert? Sehe ich das richtig?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Ja.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und noch schrittweise zusammengestaucht:

Code: Alles auswählen

replacement_map = dict(listenpaare)
neue_liste = []
for wert in external_faces2:
    wert = replacement_map.get(wert, wert)
    neue_liste.append(wert)

print neue_liste

Code: Alles auswählen

replacement_map = dict(listenpaare)
neue_liste = [replacement_map.get(wert, wert) for wert in external_faces_2]

print neue_liste
Sebastian
Das Leben ist wie ein Tennisball.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Super, dann habe ich ja heute auch noch was mitgenommen: Das '.get' kannte ich noch nicht. :D
BlackJack

Wobei man es sich mit dem `dict()` nicht ganz so einfach machen kann wenn ich die ursprüngliche Liste verstanden habe, weil dort erst der neue und dann der alte Wert in den inneren Listen steht. Die müsste man also noch tauschen.

Code: Alles auswählen

def main():
    external_faces = [0, 2, 2, 14, 4, 0, 14, 50, 44, 4, 50, 52, 52, 82, 82, 88,
                      88, 102, 102, 44]
    pairs = [[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]]
    
    old2new = dict((b, a) for a, b in pairs)
    result = [old2new.get(x, x) for x in external_faces]
    print result
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

mmmh, das sieht ja alles schon sehr gut aus. Profis halt am Werk... und nicht solche Anfänger wie ich :-)

Wie muss ich denn dann weiter verfahren bei folgender Konstellation:

Liste1 --> listenpaar[6, 0], [14, 1], [2, 2],...
Liste2 --> liste_Koordinaten [0, XYZ], [14 XYZ], [1, XYZ],[2, XYZ], ...

jetzt sollen die beiden Listen verglichen werden: wenn der 0. Eintrag des Tupels in der liste_Koordinaten = 1. Eintrag des Tupels in der Liste listenpaar. Ist dies der Fall, dann soll in einer neuen Liste die entsprechende Koordinate XYZ eingefügt werden...

hierzu hab ich jetzt erstmal liste_Koordinaten in ein dictionary umgewandelt, dann folgt der Vergleich...

Code: Alles auswählen


replacement_map2 = dict(liste_Koordinaten) # umwandeln in dictionary
neue_liste2 = ()
for key in replacement_map2: #für alle Key-Werte der Koordinatenliste
    if key in replacement_map:    #wenn der Key-Wert in der Listenpaar-Liste vorkommt (aber an der Stelle Key, nicht bei Wert)
        neue_liste2.append(replacement_map[wert]) #dann schreibe in eine neue Liste die Koordinate XYZ raus
    else:
        neue_liste2.append(wert)

print neue_liste2


das ist jetzt sicher auch wieder Schwachsinn, aber ein Versuch immerhin wert...
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

hab mich vertippt: der 0. Eintrag des Tupels in listenpaare = 0. Eintrag des Tupels in Liste_koordinaten --> dann schreibe in neue liste den 1. Eintrag der liste_koordinaten (sprich das XYZ)
Michi_J
User
Beiträge: 110
Registriert: Samstag 7. August 2010, 08:35

auf einen Fehler bin auch noch draufgekommen:
in der else-Anweisung darf nichts mehr passieren.

Code: Alles auswählen


replacement_map2 = dict(liste_Koordinaten)
neue_liste2 = []
for key in replacement_map2:
    print key
    if key in internal_faces2:
        neue_liste2.append(replacement_map2[wert]) #füge Wert der Koordinate an neue_liste2 an
        print neue_liste2
    else:
        pass
print neue_liste2

so gibt mir der Code zwar die richtige Anzahl an Koordianten aus, aber er schreibt immer nur einen Wert rein. Wie kann ich erreichen, dass er immer den entsprechenden Wert der Koordinate hernimmt?

Danke.
Antworten