2013-05-01 6 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 

किसी भी मदद कैसे के रूप में की सराहना की मैं यह ठीक करेगा। मैं सिर्फ लूप या पूरी सूची हाथ से पूरी तरह से लिखना नहीं चाहता हूं। धन्यवाद! : डी

अतिरिक्त जानकारी:

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 मैंने इसे लिंक किया है, मूल रूप से आप केवल 'एक' लूप में एक ही पुनरावर्तक के माध्यम से पुनरावृत्त कर सकते हैं, एक बार में दो बार फिर से शुरू करने के लिए, आपको 'ज़िप' का उपयोग करने की आवश्यकता होती है जो एक पुनरावर्तनीय उत्पन्न करता है जो संबंधित वस्तुओं का एक टुपल देता है सूचियों से प्रत्येक सूचकांक। – jamylak

+0

मतलब यह है कि मैं भी (जे, ट) डाल करने के लिए है या कि कोई फर्क नहीं पड़ता? –

1

@ jamylak के जवाब पर विस्तार: वैकल्पिक रूप से आप नक्शे का उपयोग कर सकते

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

हो जाएगा ताकि पैड नहीं के साथ कम सूचियों ne।

+2

'itertools.izip_longest' कि – jamylak

+0

@mgilson करने के लिए ओह कोई बेहतर तरीका है! संपादित करें: - सुधार नहीं यह है नहीं, केवल 'None' बात – jamylak

+1

@jamylak प्रतीक्षा करें। 'None' के साथ 'map' को कॉल करना python3 में चला जाता है।एक्स – 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 आइटम नहीं है कि है, इसलिए यह j और k में अनपैक नहीं किया जा सकता।

jamylak द्वारा बताया गया है, कुंजी दो iterables एक साथ zip है।

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]), 
    ... 
    } 

इस तरह से लिखा है, तो आप देखते हैं कि कैसे संरचना प्रकार की a और b होने का छोड़ दिया और सही टुकड़े के साथ एक ज़िपर (जैसा दिखता है जिपर। आप ज़िप करने के बाद, बाईं ओर एक तत्व के साथ बाईं ओर एक तत्व मिलान किया है। बेशक, आप zip पर जाने वाली वस्तुओं को अनुक्रमित करने की आवश्यकता नहीं है (सभी महत्वपूर्ण बात यह है कि आप उन पर फिर से चल सकते हैं), और आप "ज़िप" अधिक से अधिक 2 एक साथ iterables कर सकते हैं ...

+0

'पंक्तियां [14] 'पंक्तियों' सूची ' –

+0

@EthanBrouwer - धन्यवाद में अंतिम' शब्दकोश 'है। इससे मदद मिलती है (मुझे लगता है कि मुझे और सावधानी से पढ़ना चाहिए था) – mgilson

संबंधित मुद्दे