2016-10-21 2 views
0

Ich habe versucht, die Lösung dafür zu finden, kann aber nirgends hinkommen! Ich bin mir sicher, dass es eine einfache Möglichkeit gibt, das zu tun, was ich versuche, von dem ich nichts weiß.Iterieren Sie durch zwei 2D-Listen, um eine 2D-Liste mit übereinstimmenden Vorkommen zu erstellen.

Ich habe zwei 2D-Listen, ein und b (Beispiel unten). Sie können sehen, dass für die Mehrheit der Werte die Position [1] in jeder A-Liste der Position [0] in der B-Liste entspricht (zB 5158648.0 in Liste a 3 entspricht 5158648.0 in Liste b 3) - I ' Fügen Sie die Streichhölzer in fett in den folgenden Listen.

Mit anderen Worten, ist B ein Bit lange Sequenz ist, und A in der gleichen Reihenfolge, aber nur bestimmte Werte von B.

a = [[1000002,0, 0], [1000004,0, 1000002,0 ], [5158670,0, 5158648,0], [5158261,0, 5159627,0], [5155371,0, 5158256,0], [5258673,0, 5158648,0]]

b = [[1000004,0, 'TF'], [ 1000005.0, 'TF'], [5158648. 0, 'FT'], [5158670.0, 'FT'], [5387625.0, 'FT'], [5158624.0, 'FT'], [5158623.0, 'FT'], [5158668.0, 'FT'], [5158589.0 "FT"], [5158641.0, 'FT'], [5158640.0, 'FT'], [.0, 'FT'], [5158261.0, 'FT'], [5158664.0, 'TF'], [5158293.0, 'TF'], [5158291.0, 'TF'], [5158289.0, 'TF'], [5158274.0, 'TF'], [5158258.0, 'TF'], [5158272.0, 'TF'], [5158270.0 , 'TF'], [5.158.287,0, 'TF'], [5.158.256,0, 'TF'], [5.158.648,0, 'TF']]

Was ich tun möchte, ist bekommen die ' TF/FT 'von B bis zur korrekten Position in A.

Dies wäre tot einfach, mit einem Wörterbuch, aber die Komplikation ist ein Wert (zB 5.158.648,0) beiden Werte in verschiedenen Positionen in der Sequenz (‚FT‘ an einem Punkt, dann ‚TF‘ weiter unten) haben könnte ... also muss ich "an dieser Position in der Sequenz, die es hat" FT 'aber an dieser anderen Position in der Sequenz hat es TF' - siehe im obigen Beispiel, wo 5158648.0 ist sowohl FT und TF. ?

weiß jemand, der beste Weg, dies zu erreichen, um das gewünschte Endprodukt würde wie unten sein:

c = [[1000002,0, 0, 'N/A'], [1000004,0, 1000002,0, 'N/A'], [5158670,0, 5158648,0, "FT '], [5158261,0, 5159627,0,' FT '], [5.155.371,0, 5.158.256,0' TF '], [5.258.673,0, 5.158.648,0, 'TF']]

Hinweis, sind einige Werte (hier '0' und' 1.000.002,0 ') erscheint überhaupt nicht in b, also muss ich diese berücksichtigen.

Ich habe versucht, die Listen auf die Bühne, wo ich 2 Listen mit identischer Länge der übereinstimmenden Werte hatte, dann durch mit zip(), um die Werte über, aber das tricky Bit trimmen die Listen nach unten, um diese zu bekommen 2 identische Listen, insbesondere mit dem 2D-Aspekt.

Vielen Dank!


p.s. falls der Kontext hilfreich ist - jede der Zahlen ist eine Straßen-ID und die 'FT'/'TF' ist eine Reiserichtung (daher könnte es der eine Wert sein oder der andere - es hängt davon ab, wie es fährt)

+1

Möchten Sie nur Übereinstimmungen für den Index [1] des A-Tupels finden? Nicht für den ersten Wert? Wie würdest du einen Float markieren, der sowohl TF als auch FT ist? – kabanus

+0

Ja, nur der [1] Indexwert muss übereinstimmen, aber ich muss diese Verbindung zwischen a [0] und a [1] behalten. Ein Float kann nur FT oder TF in dem einen Fall sein (es ist im Wesentlichen eine Richtung, in der eine Straße gereist wird). 5158648.0 könnte an einem Punkt FT sein, aber TF weiter. Daher ist die Reihenfolge/Position der Schlüssel. – Mike

+0

Könnten Sie bitte das Beispiel (5158648.0, TF) zum Ende von B hinzufügen und was Sie erwarten, um in A zu sehen? – kabanus

Antwort

0

Ich hoffe ich habe verstanden was du versuchst zu tun. Wie ich es verstehe, bestimmt 'a' die Reihenfolge und die einzige Reihenfolge, die in 'b' zählt, ist zwischen 'ft' und 'tf' Werten mit dem gleichen Wert. So würde ich ein dict, mit einer Liste der verfügbaren Werte verwenden, um (in Ihrer Frage andeuten, dass Sie steuern, wie ‚b‘ aussieht):

b = {[1000004.0: ['TF'], [1000005.0: ['TF'], 158648.0: ['FT','TF'], 
     158670.0: ['FT'], 387625.0: ['FT'], 158624.0: ['FT'], 158623.0: ['FT'], 
     158668.0: ['FT'], 158589.0: ['FT'], 158641.0: ['FT'], 158640.0: ['FT'], 
     159627.0: ['FT'], 158261.0: ['FT'], 158664.0: ['TF'], 158293.0: ['TF'], 
     158291.0: ['TF'], 158289.0: ['TF'], 158274.0: ['TF'], 158258.0: ['TF'], 
     158272.0: ['TF'], 158270.0: ['TF'], 158287.0: ['TF'], 158256.0: ['TF']} 

Dann einfach Sie brauchen:

for x,y in a: 
    try: 
     c.append((x,y,b[y][0])) 
     b[y].pop(0) 
    except (IndexError,KeyError): 
     c.append((x,y,'NA')) 
+0

Kabanus, du hast geknackt Es ist genau das, was ich gebraucht habe. Du hast Recht, die Reihenfolge ist in A, also zählt nur das, was zuerst kommt (TF, FT usw.). Das ist eine viel einfachere Methode. – Mike

+0

(ps in 'b' oben die Nummern fehlen 5s am Anfang und fügen die darin hinzu, funktioniert wie ein Charme :-) - danke! – Mike

Verwandte Themen