2013-05-01 10 views
6

のために、私は、この現在のリスト内包持ちで複数の引数を持つリストの内包表記:パイソン -

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

、それは私に次のエラー与えている:どのように私のように感謝任意の助けを

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

をこれを修正するだろう。私は完全なforループまたはリスト全体を手作業で書く必要はありません。ありがとうございました! :D

追加情報:

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'}] 

答えて

7

あなたはそのように反復するためにそれらをzipする必要があります。

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

ジップは正確に何ですか?単なる好奇心から。 –

+1

@EthanBrouwer基本的には、forループで単一のiterableを反復することができます。一度に2つずつ反復するには、 'zip'を使用して、対応する項目のタプルを返すiterableを生成する必要があります。リストからの各インデックス。 – jamylak

+0

それは私も(j、k)を入れなければならないのですか、それとも関係ないのですか? –

1

は@ jamylakの答えに拡大:別の方法としては、マップを使用することができます

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

これは、短いリストをNo ne。あなたのコードを説明するために

+2

'itertools.izip_longest'はそれを行う良い方法です – jamylak

+0

@mgilsonああ、いいえ!編集:待っていないそれはない、 'None'事だけ – jamylak

+1

@ jamylak - 修正。 python3では 'map'を' None'と呼んでいます。x – mgilson

4

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

は同じです:

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

、我々はあなたがtupleを作成し、それを反復していることをより明確に参照してください。はじめてループを通過するときにタプルはrows[14]をあきらめる。これは2つ以上の項目を持つ辞書なので、jkに解凍することはできない。

jamylakで指摘されているように、キーはzipに2つのiterableを一緒にしています。

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

あなたがジッパーのように考えることができ:

この方法を書き出さ
zip(a,b) = [ 
    (a[0], b[0]), 
    (a[1], b[1]), 
    (a[2], b[2]), 
    ... 
    } 

を、あなたはabは、左と右の作品であることを(構造体は、ソートのジッパーに似ているかを確認ジッパーを押した後、左の要素と右の要素を一致させました。もちろん、zipに渡すオブジェクトはインデックスを作成する必要はありません(重要なのは、それらを反復処理できることです)、あなたは一緒に2つ以上のiterablesを "ジップ"することができます...

+0

'rows [14]'は 'list'行の最後の' dictionary'です。 –

+0

@EthanBrouwer - ありがとうございます。それは助けになります(私はもっと慎重に読んだはずでした) – mgilson