2016-07-10 10 views
1

Ich habe ein Wörterbuch, das dies ähnelt:Rückkehr n-mal die n-te Reihe von verschiedenen Listen in einer Liste der Wörterbücher

[{ 'key' : 10, 'values' : [ [1,2] [3,4,5] [6,7,8,9] ] }, { ... }] 

Ich versuche, neue Wörterbücher zurück mit ‚Kreuzung‘ als Schlüssel und das n-te Elemente jeder Liste als Werte, solange in der längsten Liste Werte vorhanden sind. Die Listen unterschiedlicher Länge sind, wobei die kürzere hätte nur ihre letzten Werte mehrmals, wie dies angehängt:

{10:[1,3,6]} 

{10:[2,4,7]} 

{10:[2,5,8]} 

{10:[2,5,9]} 

sollte ich als itervalues ​​iterieren(), iterkey() oder iteritems()? Es könnte eine ähnliche Frage gepostet werden, aber ich kann keinen Weg finden, kurz zu erklären, mir fehlen Schlüsselwörter.

Wie mache ich eine Funktion, die diese Aufgabe vervollständigen würde?

+0

Ist, dass Sie Ausgang erwartet füllen? –

+0

Auch was ist * Kreuzung *? –

+0

@Cunningham die Ausgabe wäre die Reihe von Wörterbüchern mit dem Wert von "Schlüssel" als Schlüssel. "Schnittpunkt" ist nur die tatsächliche Zeichenfolge, die ich für meinen eigenen Code anstelle von "Schlüssel" verwende. (Die ganzen Zahlen sind eigentlich Qgis-Punkte, die von Multi-Lines unterschiedlicher Länge abgeleitet sind. Aber ich fühlte mich, als würden sie von der Klarheit des Problems absehen.) –

Antwort

1

Sie müssen Iterierte so oft wie es Elemente in der längsten Liste von Zahlen sind. In jeder Iteration verwenden Sie den inkrementellen Index, um den n-ten Wert aus jeder Liste zu erhalten.

so etwas wie dieses Versuchen:

def intersect(key,values): 
    """ 
    Return n times the nth number of every list in `values`, 
    in a list of dictionaries. 
    """ 
    intersect_list = [] 
    longest = max(map(len,values)) 
    for n in range(longest): 
     # get the nth value if there is one, or just the last value 
     nth_values = [l[n] if n<len(l) else l[-1] for l in values] 
     intersect_list.append({key:nth_values}) 
    return intersect_list 

dict_list = [{ 'key':10, 'values':[[1,2],[3,4,5],[6,7,8,9]] }] 
for d in dict_list: 
    print(intersect(d['key'],d['values'])) 

Es wird Ihnen die gewünschte Ausgabe:

[{10: [1, 3, 6]}, {10: [2, 4, 7]}, {10: [2, 5, 8]}, {10: [2, 5, 9]}] 
+0

Danke, das funktioniert wirklich gut. Ist "map" hier gleich wie [Qmap] (http://doc.qt.io/qt-4.8/qmap.html#details)? –

+0

Die eingebaute Funktion 'map()' nimmt jedes Element in 'values' und wendet die Funktion' len() 'darauf an. Als Ergebnis erhalten Sie eine Liste von Längen und nehmen dann die größte mit 'max()' –

+0

Also 'map()' ist nicht das gleiche wie Qmap. –

0

Hier ist ein Einzeiler, der funktionieren sollte, aber beachten Sie, dass Ihre Ausgabe kein Wörterbuch sein kann, weil Sie nicht denselben Schlüssel mehrmals in einem Wörterbuch anzeigen lassen können.

def intersection(key, values): 
    return [(key, [L[i] if len(L) > i else L[-1] for L in values]) for i in range(max(map(len, values)))] 

print(intersection(10, ([1,2], [3,4,5], [6,7,8,9]))) 

# >>> [(10, [1, 3, 6]), (10, [2, 4, 7]), (10, [2, 5, 8]), (10, [2, 5, 9])] 
Verwandte Themen