2016-06-30 6 views
0

alist = [ 'A', 'B ' C', 'D']python - durch die Liste iterieren, um das aktuelle Element als Schlüssel, und die vorderen und hinteren Elemente als Werte zuzuordnen?

was diese Liste repräsentiert ist: A < -> B < -> C < -> D

Ich möchte auf Karte wie die folgenden:

A: B

B: A, C

C: B, D

D: C

Zuerst habe ich:

Aber das ist offensichtlich falsch, weil es zwei Elemente überspringt.

alist = ['A','B', 'C', 'D'] 
graph = {} 
i = 2 
while i < len(alist): 
    current, front, back = alist[i-1], alist[i-2], alist[i] 
    if current not in graph: 
     graph[current] = [front, back] 
    else: 
     graph[current].append(front) 
     graph[current].append(back) 
    i+=1 

Wie könnte ich das beheben? Bare mit mir bitte, ich bin wirklich schlecht mit Iterationen ..

+1

Wird die Liste nur ein eindeutiges Element enthalten, oder ist das der Grund, warum Sie 'if current not in graph' überprüfen? –

+0

Was passiert, wenn ich 0 bin? Denken Sie daran – Natecat

+0

@ juanpa.arrivillaga oops Ich denke, dass es für diesen Fall unnötig ist, da wir nur eine Liste betrachten, aber es nimmt ursprünglich eine Liste von Diagrammen! Ich habe es vereinfacht, aber vergessen, das herauszunehmen – bisuke

Antwort

2

Schon jetzt gibt es viele Lösungen, das ist ein sehr einfach zu verstehen:

alist = ['A','B', 'C', 'D'] 
graph = {} 
for index, item in enumerate(alist): 
    if index == 0: 
     if len(alist) == 1: 
      graph[item] = [] 
      break 
     graph[item] = [alist[index+1]] 
    elif index == len(alist)-1: 
     graph[item] = [alist[index-1]] 
    else: 
     graph[item] = [alist[index-1], alist[index+1]] 

Ausgang:

>>> print graph 

154: {'A': ['B'], 'B': ['A', 'C'], 'C': ['B', 'D'], 'D': ['C']} 

Dank @mglison für die Ausnahme unter Hinweis darauf, wenn len(alist) == 1, herausgegeben

+0

Ich mag es. Es könnte etwas netter als meins für den hartcodierten Nur-2-Elemente-Fall sein. – mgilson

+0

In der Tat ist dies sehr logisch und leicht zu verstehen. Vielen Dank! – bisuke

+0

Es gibt einen Randfall, den dies nicht ganz richtig behandelt. Wenn 'alist = [' A '] ', dann wird dies einen' IndexError' auslösen. Ich bin mir nicht sicher, was das Verhalten _should_ sein sollte ... Aber es _probably_ ist kein 'IndexError': -) ... – mgilson

2

Was ist so etwas wie:

graph = {} 
for i, item in enumerate(alist): 
    connections = [] 
    for j in (i-1, i+1): # look at element before and after the i'th 
     if 0 <= j < len(alist): # check if the index is valid for `alist` 
      connections.append(alist[j]) 
    graph[item] = connections 

Beachten Sie, dass dies nur funktioniert, für alist ist eine Folge von irgendeiner Art. Es wird nicht für Generatoren funktionieren. Außerdem bin ich normalerweise kein Fan der Überprüfung, ob ein Index in der Liste ist. Ich würde eher try: ... except IndexError: ... (EAFP), aber IndexError würde nicht für negative j ausgelöst werden, so dass ich diese Route für diese bestimmte Anwendung vermieden).

+0

Sehr saubere Lösung –

+0

Vielen Dank !! das funktioniert perfekt. – bisuke

0

Dies ist fast definitiv nicht das, was Sie wollen, aber es war so eine süße One-Line-Lösung für Ihr Problem, dem ich nicht widerstehen konnte.

> l = ['A','B','C','D'] 
> { k: filter(None, [v1,v2]) for (k,v1,v2) in zip(l,[None]+l[:-1],l[1:]+[None]) } 
{'A': ['B'], 'C': ['B', 'D'], 'B': ['A', 'C'], 'D': ['C']} 
+0

Ich denke, dass '[None] + l [: - 1]' vereinfacht (und optimiert) werden konnte, um '[None] + l' zu erhalten, da' zip' abgeschnitten wird, wenn der kürzeste Iterable abläuft. Es würde sowieso eine Zwischenliste ausschneiden ... – mgilson

+0

schön, danke!das ist auch sehr hilfreich! – bisuke

+0

@mgilson guten Fang, obwohl diese Art der Symmetrie tötet. Nicht, dass irgendetwas davon zählt ... das ist nicht [Codegolf] (http://codegolf.stackexchange.com) :) – Alec

0

Hier ist eine schnelle und schmutzige Lösung (es gibt bessere Möglichkeiten, die ich für längere Gegenstände sicher bin).

graph = {alist[0]: alist[1], alist[-1]: alist[-2]} # terminal elements 
for i in range(1, len(alist)-1):     # middle elements 
    graph[alist[i]] = [alist[i-1], alist[i+1]] 

In [43]: for k, v in sorted(graph.iteritems()): 
    print "{} -> {}".format(k, v) 
    ....:  
A -> B 
B -> ['A', 'C'] 
C -> ['B', 'D'] 
D -> C 
Verwandte Themen