2012-05-27 16 views
96

मान लीजिए मैं इस तरह एक सूची है की सुविधा देता है:अजगर सूची समझ अंदर की गणना का उपयोग

mylist = ["a","b","c","d"] 

मूल्यों उनके सूचकांक के साथ मैं अब इस

>>> for i,j in enumerate(mylist): 
...  print i,j 
... 
0 a 
1 b 
2 c 
3 d 
>>> 

तरह पायथन के enumerate समारोह का उपयोग कर सकते के साथ मुद्रित करने के लिए , जब मैं एक list comprehension अंदर इसका इस्तेमाल करने की कोशिश यह मुझे इस त्रुटि देता है

>>> [i,j for i,j in enumerate(mylist)] 
    File "<stdin>", line 1 
    [i,j for i,j in enumerate(mylist)] 
     ^
SyntaxError: invalid syntax 

तो, मेरा सवाल है: सूची समझ के अंदर गणना का सही तरीका क्या है?

उत्तर

128

इस प्रयास करें:

[(i, j) for i, j in enumerate(mylist)] 

आप एक टपल अंदर i,j डाल करने के लिए सूची समझ से काम करने के लिए की जरूरत है। वैकल्पिक रूप से, यह देखते हुए कि enumerate()पहले से ही एक टपल देता है, तो आप सीधे लौट सकते हैं यह पहली बार खोल के बिना:

[pair for pair in enumerate(mylist)] 

किसी भी तरह से, नतीजा यह है कि वापस आ जाता है की उम्मीद है:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 
+4

एक टुपल होना अनिवार्य नहीं है। I और j का उपयोग करने वाली कोई भी अभिव्यक्ति – Alvaro

+0

गणना का उपयोग बहुत अच्छा है, इसे itertools – Pramit

+1

का उपयोग करके इसे और अधिक कुशल बनाने के बारे में बस याद रखें कि एक टुपल ',' ** ** ** '()' । तो "एक tuple के अंदर 'मैं, जे' डालने" कोई मतलब नहीं है, क्योंकि 'मैं, जे' पहले से ही एक tuple है! समस्या यह है कि सूची कंप पार्सर को कथन समूह के लिए माता-पिता की आवश्यकता होती है। – cowbert

8

यहाँ एक है वैकल्पिक रूप से

>>> mylist = ['a', 'b', 'c', 'd'] 
>>> [item for item in enumerate(mylist)] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 

, आप कर सकते हैं: जिस तरह से यह करने के लिए

>>> [(i, j) for i, j in enumerate(mylist)] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 

आपको एक त्रुटि मिलने का कारण यह था कि आप इसे i और j के आसपास एक टुपल बनाने के लिए गायब थे।

5

tuples के बारे में स्पष्ट रहें।

[(i, j) for (i, j) in enumerate(mylist)] 
29

या, यदि आप एक सूची समझ का उपयोग करने पर जोर देते हैं नहीं है:

>>> mylist = ["a","b","c","d"] 
>>> list(enumerate(mylist)) 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 
37

बस वास्तव में स्पष्ट हो सकता है, यह कुछ भी नहीं enumerate के साथ क्या करना है और सब कुछ सूची समझ वाक्य रचना के साथ क्या करना है।

[(i,j) for i in range(3) for j in 'abc'] 

इस dicts की एक सूची:

[{i:j} for i in range(3) for j in 'abc'] 

सूचियों की एक सूची:

[[i,j] for i in range(3) for j in 'abc'] 

में सिंटेक्स त्रुटि:

इस सूची में समझ tuples की सूची लौटाता है

[i,j for i in range(3) for j in 'abc'] 

कौन सा असंगत (IMHO) और शब्दकोश comprehensions वाक्य रचना के साथ भ्रामक है:

>>> {i:j for i,j in enumerate('abcdef')} 
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'} 

और tuples का एक सेट:

>>> {(i,j) for i,j in enumerate('abcdef')} 
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')]) 

के रूप में Oscar Lopez ने कहा, तुम बस की गणना टपल सीधे पारित कर सकते हैं:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')] 
11

यदि आप लंबी सूचियों का उपयोग कर रहे हैं, तो यह सूची समझ तेजी से दिखाई देता है, और अधिक री dable।

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))" 
1000000 loops, best of 3: 1.61 usec per loop 
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]" 
1000000 loops, best of 3: 0.978 usec per loop 
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]" 
1000000 loops, best of 3: 0.767 usec per loop 
+2

+1 मैंने इसका परीक्षण नहीं किया, लेकिन मैं शर्त लगाऊंगा कि टी [टी एन एन्युमेरेट (मेरी सूची)] टी भी तेज है। –

+0

बस इसे अपडेट किया गया। आप सही हे। – beardc

0

सभी महान उत्तर लोग। मैं जानता हूँ कि प्रश्न यहाँ गणन के लिए विशिष्ट है, लेकिन कैसे कुछ इस तरह, सिर्फ एक और परिप्रेक्ष्य के बारे में

from itertools import izip, count 
a = ["5", "6", "1", "2"] 
tupleList = list(izip(count(), a)) 
print(tupleList) 

अगर एक प्रदर्शन के मामले में समानांतर में एकाधिक सूचियों पुनरावृति करना पड़ता है यह, और अधिक शक्तिशाली हो जाता है। बस एक विचार

a = ["5", "6", "1", "2"] 
b = ["a", "b", "c", "d"] 
tupleList = list(izip(count(), a, b)) 
print(tupleList) 
संबंधित मुद्दे