सूची समझ के अंदर पायदान का उपयोग करते हुए पायथन


125

मान लीजिए कि मेरे पास इस तरह की एक सूची है:

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

उनके सूचकांक के साथ मूल्यों को मुद्रित करने के लिए मैं enumerateइस तरह से पायथन के कार्य का उपयोग कर सकता हूं

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

अब, जब मैं इसे अंदर उपयोग करने की कोशिश 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

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

जवाबों:


166

इसे इस्तेमाल करे:

[(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

गणन के उपयोग, यह कैसे और अधिक कुशल itertools का उपयोग कर बनाने के बारे में महान है
Pramit

3
बस याद रखें कि एक टपल , नहीं द्वारा बनाया गया है ()। इसलिए " i,jटपल के अंदर रखना" कोई मतलब नहीं है, क्योंकि i,jपहले से ही एक टपल है! समस्या यह है कि लिस्ट कॉम्प पार्सर को स्टेटमेंट ग्रुप के लिए पार्न्स की जरूरत है।
काउबर्ट

46

बस वास्तव में स्पष्ट होने के लिए, यह 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']

एक सिंटैक्स त्रुटि:

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

जो असंगत (IMHO) है और डिक्शनरी कॉम्प्रिहेंशन सिंटैक्स के साथ भ्रमित है:

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

और टुपल्स का एक सेट:

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

जैसा कि justscar López ने कहा है, आप बस एन्युमरेट टपल को सीधे पास कर सकते हैं:

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

32

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

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

12

यदि आप लंबी सूचियों का उपयोग कर रहे हैं, तो यह सूची की तेजी से प्रकट होती है, अधिक पठनीय का उल्लेख करने के लिए नहीं।

~$ 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 मैंने इसका परीक्षण नहीं किया, लेकिन मैं शर्त लगा सकता हूं कि [t for t in enumerate(my list)]यह और भी तेज है
भेड़िये

11

यहाँ यह करने का एक तरीका है:

>>> 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इसे टपल बना रहे थे।



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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.