2017-01-29 1 views
2

Ich habe eine Liste von Werten in der Form von: [0,1], [0,2], [1,3], [2,4], [3,5], [4,6], [5,7], [7,9].Iterieren durch Liste basierend auf Zeichenwert in jedem Listenelement (Python)

Ich würde gerne die Liste durchlaufen, beginnend bei [0,1] und wenn das zweite Zeichen (in diesem Fall 1) gleich dem des ersten Zeichens eines anderen Listenelements ist (in diesem Fall würde dies [1,3] entsprechen gehen würde [1,3] und dann [3,5], [5,7] und schließlich [7,9]. an welcher Stelle es auf dem zweiten Element beginnen würde ([0,2]) und das gleiche tun, in zwei Listen gipfelt.

um zu klären, die Liste selbst enthält Werte, die beide auch sind und seltsam, anders als das Beispiel, das ich hier zeige, also kann ich es nicht darauf basierend teilen.

Irgendwelche Ideen, um mich in die richtige Richtung mit diesem zu stoßen würde sehr geschätzt werden.

+3

Haben Sie versucht, einen Code, den wir sehen können? – Alex

+2

Was würden Sie tun, wenn mehr als eine Auswahl verfügbar ist? Nehmen wir an, die Liste enthält sowohl "[1,3]" als auch "[1,4]". –

+0

um das obige Beispiel fortzusetzen, würde es durch [0,1] bis [7,9] laufen und dann zurück [0,2] bis [4,6] –

Antwort

1

Hier ist eine rekursive Lösung, die die Elemente so lange wie möglich zu folgen versucht, von alternativen unvisited Wege die Pflege zu:

from collections import defaultdict 
def split(items): 
    # create lookup 
    lookup = defaultdict(set) 
    for k, v in items: 
     lookup[k].add(v) 

    results = [] 
    while sum(map(len, lookup.values())): 
     # get first element from remaining items 
     first_k = min((k for k in lookup if len(lookup[k]))) 
     first = first_k, min(lookup[first_k]) 

     # follow that element 
     results.append(follow(first, lookup)) 

    return results 

def follow(item, lookup): 
    item_k, item_v = item 
    lookup[item_k].remove(item_v) 

    result = [item] 
    # loop through all follow-up items (if any) 
    for next_item in sorted(lookup[item_v]): 
     # recursively follow the follow-up item 
     result.extend(follow((item_v, next_item), lookup)) 
    return result 

lke benutzten:

>>> def test(items): 
     for x in split(items): 
      print(x) 

>>> test([[0,1], [0,2], [1,3], [2,4], [3,5], [4,6], [7,9]]) 
[(0, 1), (1, 3), (3, 5)] 
[(0, 2), (2, 4), (4, 6)] 
[(7, 9)] 

Es ignoriert Pfade zu Artikeln, die bereits besucht wurden:

>>> test([[0, 1], [1, 2], [4, 3], [2, 5], [5, 1]]) 
[(0, 1), (1, 2), (2, 5), (5, 1)] 
[(4, 3)] 

Aber folgt alle von ihnen um, wenn es mehr solche (sortierte, nicht original Reihenfolge):

>>> test([[0, 1], [1, 2], [1, 3], [2, 4], [3, 5]]) 
[(0, 1), (1, 2), (2, 4), (1, 3), (3, 5)] 

Und es funktioniert für Ihr komplexes Beispiel auch:

>>> test([[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 6], [5, 7], [7, 9], [8, 10], [8, 11], [10, 12], [11, 13], [11, 14], [12, 15], [12, 16], [6, 8], [8, 17]]) 
[(0, 1), (1, 3), (3, 5), (5, 7), (7, 9)] 
[(0, 2), (2, 4), (4, 6), (6, 8), (8, 10), (10, 12), (12, 15), (12, 16), (8, 11), (11, 13), (11, 14), (8, 17)] 
+0

danke für diese Idee - leider enthalten die Listen immer k Werte, die gleich sind, so dass ich von einem Lookup-Ansatz wegbleiben werde. –

+0

Sie brauchen noch eine Suche. Wie auch immer, hier ist eine aktualisierte Version zu Ihren geklärten Anforderungen. – poke

+0

Danke für Ihre Hilfe, ich werde damit anfangen, meinen Kopf zu bekommen. –

0

Sie können wie gewohnt nicht durchlaufen, die unter Verwendung die "for" -Schleife, weil for-Schleife nicht auf einen bestimmten Wert springen kann. Verwenden Sie eine "while" -Schleife. Dieser Code findet alle Wertpakete, die ihren letzten und ersten Werten entsprechen. Sie können damit auch übereinstimmende Werte aus der Mitte einer komplexen Liste finden.

listoflists = [[0,1], [0,2], [1,3], [2,4], [3,5], [4,6], [7,9]] 

addr0 = 0 
addr1 = 0 
print len(listoflists) 
while addr0 < len(listoflists): 
    val0 = listoflists[addr0] 
    last_num = val0[1] 
    while addr1 < len(listoflists): # Second iteration for finding the matching value 
     val1 = listoflists[addr1] 
     if val1[0] == last_num: 
      print "found: ",listoflists[addr0], listoflists[addr1] # Found the matching values 
      addr0 = addr1 
      break 
     addr1 += 1 
    addr0 += 1 
Verwandte Themen