2013-05-01 8 views
6

Ich habe dieses aktuelle Liste Verständnis:Python - Liste Verständnis mit mehreren Argumenten in dem für

... 
cur = [[14, k, j] for j, k in rows[14], range(15)] 
... 

und es wird mir die folgende Fehlermeldung geben:

...   
    cur = [[14, k, j] for j, k in rows[14], range(15)] 
ValueError: too many values to unpack 

Jede mögliche Hilfe geschätzt, wie in, wie ich würde das beheben. Ich möchte einfach nicht eine vollständige for-Schleife oder die ganze Liste von Hand schreiben müssen. Vielen Dank! : D

Zusätzliche Informationen:

rows = [{1: '75'}, 
     {1: '95', 2: '64'}, 
     {1: '17', 2: '47', 3: '82'}, 
     {1: '18', 2: '35', 3: '87', 4: '10'}, 
     {1: '20', 2: '04', 3: '82', 4: '47', 5: '65'}, 
     {1: '19', 2: '01', 3: '23', 4: '75', 5: '03', 6: '34'}, 
     {1: '88', 2: '02', 3: '77', 4: '73', 5: '07', 6: '63', 7: '67'}, 
     {1: '99', 2: '65', 3: '04', 4: '28', 5: '06', 6: '16', 7: '70', 8: '92'}, 
     {1: '41', 2: '41', 3: '26', 4: '56', 5: '83', 6: '40', 7: '80', 8: '70', 9: '33'}, 
     {1: '41', 2: '48', 3: '72', 4: '33', 5: '47', 6: '32', 7: '37', 8: '16', 9: '94', 10: '29'}, 
     {1: '53', 2: '71', 3: '44', 4: '65', 5: '25', 6: '43', 7: '91', 8: '52', 9: '97', 10: '51', 11: '14'}, 
     {1: '70', 2: '11', 3: '33', 4: '28', 5: '77', 6: '73', 7: '17', 8: '78', 9: '39', 10: '68', 11: '17', 12: '57'}, 
     {1: '91', 2: '71', 3: '52', 4: '38', 5: '17', 6: '14', 7: '91', 8: '43', 9: '58', 10: '50', 11: '27', 12: '29', 13: '48'}, 
     {1: '63', 2: '66', 3: '04', 4: '68', 5: '89', 6: '53', 7: '67', 8: '30', 9: '73', 10: '16', 11: '69', 12: '87', 13: '40', 14: '31'}, 
     {1: '04', 2: '62', 3: '98', 4: '27', 5: '23', 6: '09', 7: '70', 8: '98', 9: '73', 10: '93', 11: '38', 12: '53', 13: '60', 14: '04', 15: '23'}] 

Antwort

7

Sie müssen sie zip wie das iterieren:

cur = [[14, k, j] for j, k in zip(rows[14], range(15))] 
+0

Was genau ist das Zippen? Nur aus Neugier. –

+1

@EthanBrouwer Ich verknüpfte es, im Grunde können Sie nur durch ein einzelnes iterable in einer 'for' Schleife durchlaufen, um zwei auf einmal zu durchlaufen, müssen Sie' zip' verwenden, die ein iterables erzeugt, das ein Tupel der entsprechenden Elemente bei zurückgibt jeder Index aus den Listen. – jamylak

+0

Bedeutet das, ich muss auch (j, k) setzen oder ist das egal? –

1

Erweiterung auf @ jamylak Antwort: Alternativ können Sie Karte

cur = [[14, k, j] for j, k in map(None,rows[14], range(15))] 
verwenden

Dadurch werden die kürzeren Listen mit Nein aufgefüllt ne.

+2

'itertools.izip_longest' ist der bessere Weg das zu tun – jamylak

+0

@mgilson oh nein! edit: warte nein es hat nicht, nur das 'None' Ding – jamylak

+1

@jamylak - Korrektur. Der Aufruf von 'map' mit' None' geht in python3 verloren.x – mgilson

4

Code erklären:

cur = [[14, k, j] for j, k in rows[14], range(15)] 

das gleiche wie:

cur = [[14, k, j] for j, k in (rows[14], range(15))] 
Jetzt

sehen wir deutlicher, dass Sie eine tuple erstellt haben und über sie iterieren. Das erste Mal durch die Schleife gibt das Tupel rows[14] auf, das ein Wörterbuch ist, das mehr als 2 Elemente enthält, so dass es nicht in j und k ausgepackt werden kann.

Wie von jamylak festgestellt, ist der Schlüssel zu zip die beiden iterables zusammen.

cur = [[14, k, j] for j,k in zip(rows[14],range(15))] 

Sie es wie ein Reißverschluss denken kann:

zip(a,b) = [ 
    (a[0], b[0]), 
    (a[1], b[1]), 
    (a[2], b[2]), 
    ... 
    } 

diese Art und Weise geschrieben, Sie sehen, wie sich die Struktur Art eines Reißverschlusses ähnelt (mit a und b wobei die linken und rechten Stücke Nach dem Zippen haben Sie ein Element auf der linken Seite mit einem Element auf der rechten Seite abgeglichen Die Objekte, die Sie an zip übergeben, müssen nicht indexierbar sein (Sie können nur über sie iterieren)), und Sie können mehr als 2 Iterables zusammen "zippen" ...

+0

'rows [14]' ist das letzte 'Wörterbuch' in den Zeilen' liste' –

+0

@EthanBrouwer - Danke. Das hilft (ich denke, ich hätte es besser lesen sollen) – mgilson

Verwandte Themen