2011-08-29 6 views
11

अभी मैं टीम में मेरी सूचकांक इसपायथन में इंडेक्स को ट्रैक करने का सही तरीका क्या है?

index = 0 
for entry in longList: 
    if entry == 'foo': 
     print index 
    index += 1 

तरह पाश ट्रैकिंग कर रहा हूँ वहाँ यह करने के लिए एक बेहतर तरीका है?

longList.index('foo') 
+0

आप वास्तव में क्या करना चाहते हैं? –

+1

http://stackoverflow.com/questions/1185545/python-loop-counter-in-a-for-loop/1185557#1185557 – develerx

उत्तर

18
for index, entry in enumerate(longList): 
    if entry == 'foo': 
     print index 
5

हाँ, सबसे अच्छा तरीका यह करने के लिए है।

for index, entry in enumerate(longList): 
    if entry == 'foo': 
     print index 

हालांकि, अपने विशिष्ट मामले में, आप बस index = longList.index("foo")

संपादित कर सकते हैं: आप कई मैचों के सूचकांकों को खोजने के लिए काफी तेजी से के रूप में शुद्ध पायथन में संभव है चाहते हैं, निम्नलिखित कोड को चाल करना चाहिए:

indices = tuple(index for index, element in enumerate(longList) if element=='foo') 
+1

+1, हालांकि, यह 'ValueError' बढ़ाएगा यदि" foo "' isn ' 'लांगलिस्ट' के सदस्य नहीं हैं जबकि ओपी का कोड बस कुछ भी प्रिंट नहीं करेगा। –

+8

और यदि हम विशेष रूप से प्राप्त कर रहे हैं, तो यह डुप्लीकेट नहीं मिलेगा। –

+2

मैं यह कर रहा था लेकिन जब मैं इसे कई हज़ार प्रविष्टियों में चलाता हूं तो यह धीरे-धीरे धीमा हो जाता है और गहरा धीमा हो जाता है, मैं सूची में जाता हूं। यही कारण है कि मैं अब लूप का उपयोग कर रहा हूं जिसका मैं उपयोग कर रहा हूं। – John

10

उपयोग enumerate() में निर्मित समारोह:

3

गणना का उपयोग करना एक बेहतर विचार होगा।

for ind,item in enumerate(longList): 
    if item == 'foo': 
     print ind 
6

मैं सूची समझ :)

[index for (index,entry) in enumerate(longList) if entry == 'foo'] 
+0

+1, लेकिन '(इंडेक्स, एंट्री) 'के आसपास कोष्ठक की आवश्यकता नहीं है। याद रखें, पाइथन कॉमा में ट्यूपल्स बनाते हैं, ब्रांड्स नहीं। साथ ही, सूची समझ के बजाए जनरेटर अभिव्यक्ति का उपयोग करना आम तौर पर बेहतर होता है। तो, '(सूचकांक के लिए सूचकांक, एन्युमरेट (लंबी सूची) में प्रवेश अगर प्रविष्टि ==' foo ') '। –

+1

कोष्ठक के साथ मेरे लिए पढ़ना आसान है :) दरअसल, अगर आप केवल प्रिंट करना चाहते हैं, तो जनरेटर लें। – steabert

3

यदि आपकी सूची बहुत लंबा और स्थिर है, तो आप एक लुकअप तालिका (वास्तव में, कुंजी के रूप में प्रवेश के साथ सूचकांक सूचियों का एक शब्दकोश का उपयोग कर विचार करना चाहिए की तरह)। पहली खोज के बाद यह लगभग खुद के लिए भुगतान करेगा, क्योंकि आप वर्तमान में हमेशा सभी तत्वों पर फिर से सक्रिय होते हैं।

from collections import defaultdict 

# Create and fill the table (only once or whenever the list changes) 
lookupTable = defaultdict(list) 
for index, entry in enumerate(longList): 
    lookupTable[entry].append(index) 

# Search the list (as many times as you want) 
indexes = lookupTable.get('foo') 
# and you get either 'None' or a list of indexes '[1,10,20]' 
+0

+1 मैं इसके लिए बहुत सारे आवेदन देख सकता था, मुझे इस पर कुछ शोध करना होगा। – John

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