पायथन सूची की पुनरावृत्ति के लिए सूचकांक शुरू करें


90

पायथन में सूची को पुनरावृत्त करते समय एक स्टार्ट इंडेक्स सेट करने का सबसे अच्छा तरीका क्या है। उदाहरण के लिए, मेरे पास सप्ताह के दिनों की एक सूची है - रविवार, सोमवार, मंगलवार, ... शनिवार - लेकिन मैं सोमवार से शुरू होने वाली सूची के माध्यम से पुनरावृति करना चाहता हूं। ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है?


1
क्या आप केवल शनिवार तक लूप करना चाहते हैं, या क्या आप चाहते हैं कि यह चारों ओर लपेटे और पिछले रविवार को प्रिंट करे?
जुआनकोपंजा २

मैं सिर्फ शनिवार तक लूप करना चाहता था। मुझे अब तक एहसास नहीं हुआ था कि आप पायथन सूची में स्लाइसिंग का उपयोग कर सकते हैं।
विन्सेन्ट कैटेलानो

क्या ऐसा कोई समाधान है जो जनरेटर / पुनरावृत्तियों से भी संबंधित है और न केवल सूचियाँ? या वास्तव में बड़ी सूची?
चार्ली पार्कर

जवाबों:


177

आप स्लाइसिंग का उपयोग कर सकते हैं :

for item in some_list[2:]:
    # do stuff

यह तीसरे तत्व पर शुरू होगा और अंत तक पुनरावृत्त होगा।


2
यही वह है जिसकी तलाश में मैं हूं। धन्यवाद!
विंसेंट कैटलानो

30
क्या यह बड़ी सूचियों के लिए अक्षम नहीं है? मेरा मानना ​​है कि इस स्लाइस ऑपरेशन को उन सूची तत्वों को कॉपी करना है जिन्हें एक नई सूची में संदर्भित किया जा रहा है।
अंडरडेकल

4
हाँ यह बड़ी सूचियों के लिए अक्षम है। एक समाधान के लिए नीचे gnibblers उत्तर देखें जो कॉपी नहीं करता है।
ब्योर्न पोलेक्स

अगर आप जनरेटर / पुनरावृत्तियों का उपयोग करके लूप कर रहे हैं तो आप यह कैसे करते हैं?
चार्ली पार्कर

2
आपको isliceजॉन ला रोय के उत्तर में सुझाए अनुसार उपयोग करना चाहिए ।
ब्योर्न पोलेक्स

52

islice इसका लाभ यह है कि इसे सूची के भाग की प्रतिलिपि बनाने की आवश्यकता नहीं है

from itertools import islice
for day in islice(days, 1, None):
    ...

13

आप हमेशा पारंपरिक सी स्टाइल लूपिंग के इंडेक्स काउंटर का उपयोग करके लूप कर सकते हैं:

for i in range(len(l)-1):
    print l[i+1]

हमेशा "हर तत्व पर पाश" शैली का पालन करना बेहतर होता है क्योंकि यह सामान्य बात है, लेकिन अगर यह आपके रास्ते में हो जाता है, तो बस याद रखें कि पारंपरिक शैली भी समर्थित है, हमेशा।


9

stdlib आपको हुक देगा बेटा!

deque.rotate():

#!/usr/local/bin/python2.7

from collections import deque

a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
a.rotate(3)
deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])

4

सब तुम चाहते से मुद्रित करने के लिए है, तो Mondayउसके बाद, आप उपयोग कर सकते हैं listकी indexपुनरावृति के रूप में अन्य पदों में विस्तार से बताया वहां से स्थिति में जहाँ "सोमवार" सूची में है पता लगाने के लिए विधि, और। list.index"सोमवार" के लिए अनुक्रमणिका को हार्ड-कोडिंग के उपयोग से बचाता है, जो त्रुटि का संभावित स्रोत है:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

वास्तव में अच्छा समाधान!
aderchox

3

यहां एक रोटेशन जनरेटर है जिसे इनपुट अनुक्रम की एक विकृत प्रतिलिपि बनाने की आवश्यकता नहीं है ... यदि इनपुट अनुक्रम 7 आइटम से बहुत बड़ा है तो उपयोगी हो सकता है।

>>> def rotated_sequence(seq, start_index):
...     n = len(seq)
...     for i in xrange(n):
...         yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>

हां - और अनंत आवर्ती अनुक्रम उत्पन्न करने के लिए विस्तार करना आसान होगा।
स्लॉथ्रोप

@JohnMachin को धन्यवाद देने में मदद नहीं कर सकता: इन 264 वर्षों में किसी के लिए महान काम
jjon

1

लोग सूची स्लाइसिंग का उपयोग क्यों कर रहे हैं (धीमी गति से क्योंकि यह एक नई सूची में कॉपी हो जाता है), लाइब्रेरी फ़ंक्शन आयात कर रहा है, या इसके लिए एक सरणी को घुमाने की कोशिश कर रहा है?

range(start, stop, step)(जहां startऔर stepवैकल्पिक तर्क हैं) के साथ एक सामान्य फॉर-लूप का उपयोग करें ।

उदाहरण के लिए, अनुक्रमणिका 1 से शुरू होने वाली सरणी के माध्यम से लूपिंग:

for i in range(1, len(arr)):
    print(arr[i])

0

यदि आप "चारों ओर लपेटना" चाहते हैं और प्रभावी रूप से सोमवार से शुरू करने के लिए सूची को घुमाते हैं (बजाय सोमवार से पहले आइटम काट लें):

dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
            'Friday', 'Saturday',  ]

startDayName = 'Monday'

startIndex = dayNames.index( startDayName )
print ( startIndex )

rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]

for x in rotatedDayNames:
    print ( x )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.