2012-01-20 19 views
17

पर शुरू मैं एक सूची है कहो। आम तौर पर, यह कुछ इस तरह करना होगा,सूची के माध्यम से साइकिल एक निश्चित तत्व

1, 2, 3, 4, 1, 2, 3, 4, 1, 2... 

मैं चक्र, जरूरी नहीं कि एक सूचकांक में एक निश्चित बिंदु पर शुरू करने के लिए सक्षम होना चाहते हैं, लेकिन शायद एक तत्व से मेल खाते।

4, 1, 2, 3, 4, 1, 2, 3, 4, 1... 

मैं यह कैसे पूरा कर सकते हैं, मैं जो कुछ भी सूची ==4 में तत्व है, तो उत्पादन होगा पर शुरू करना चाहता था कहते हैं?

उत्तर

20

पर itertools देखो मॉड्यूल। यह सभी आवश्यक कार्यक्षमता प्रदान करता है।

from itertools import cycle, islice, dropwhile 

L = [1, 2, 3, 4] 

cycled = cycle(L) # cycle thorugh the list 'L' 
skipped = dropwhile(lambda x: x != 4, cycled) # drop the values until x==4 
sliced = islice(skipped, None, 10) # take the first 10 values 

result = list(sliced) # create a list from iterator 
print(result) 

आउटपुट:

[4, 1, 2, 3, 4, 1, 2, 3, 4, 1] 
1

हम्म, http://docs.python.org/library/itertools.html#itertools.cycle इस तरह के एक प्रारंभिक तत्व नहीं है।

हो सकता है कि आप अभी भी चक्र शुरू करें और पहले तत्वों को छोड़ दें जिन्हें आप पसंद नहीं करते हैं।

7

अंकगणित mod ऑपरेटर का उपयोग करें। आप स्थिति k से शुरू कर रहे हैं मान लीजिए, तो k इस तरह अद्यतन किया जाना चाहिए:

k = (k + 1) % len(l) 

आप एक निश्चित तत्व से शुरू करने के लिए चाहते हैं, नहीं सूचकांक, तो आप हमेशा इसे k = l.index(x) की तरह लग सकता है, जहां एक्स वांछित है आइटम।

2
import itertools as it 
l = [1, 2, 3, 4] 
list(it.islice(it.dropwhile(lambda x: x != 4, it.cycle(l)), 10)) 
# returns: [4, 1, 2, 3, 4, 1, 2, 3, 4, 1] 

तो इटरेटर आप चाहते है:

it.dropwhile(lambda x: x != 4, it.cycle(l)) 
+4

'4 .__ cmp__' भी बदसूरत लैम्ब्डा –

+0

के बजाय काम करता है @gnibbler यह कोष्ठक में 4'' डाल करने के लिए ले जाएगा '(4) .__ cmp__'। अन्यथा यह काम नहीं करता है (कम से कम पायथन 2.7.2 में)। और कोष्ठक के साथ यह सुंदर दिखता नहीं है। – ovgolovin

+0

@gnibbler और पायथन 3 के रूप में यह '__cq__' के बजाय' __eq__' का उपयोग करने के लिए ले जाएगा (संस्करण 3 के रूप में कोई '__cmp__' नहीं है)। – ovgolovin

2

मैं मॉड्यूल आयात करने के लिए जब आप लाइनों के एक जोड़े में अपने स्वयं के द्वारा कर सकते हैं की इतनी बड़ी प्रशंसक नहीं हूँ। यहाँ आयात के बिना मेरे समाधान है:

def cycle(my_list, start_at=None): 
    start_at = 0 if start_at is None else my_list.index(start_at) 
    while True: 
     yield my_list[start_at] 
     start_at = (start_at + 1) % len(my_list) 

यह एक (अनंत) इटरेटर अपनी सूची पाशन वापस आ जाएगी। चक्र में अगले तत्व प्राप्त करने के लिए आप next कथन का उपयोग करना होगा:

>>> it1 = cycle([101,102,103,104]) 
>>> next(it1), next(it1), next(it1), next(it1), next(it1) 
(101, 102, 103, 104, 101) # and so on ... 
>>> it1 = cycle([101,102,103,104], start_at=103) 
>>> next(it1), next(it1), next(it1), next(it1), next(it1) 
(103, 104, 101, 102, 103) # and so on ... 
+4

'itertools'' सी' में लिखा गया है। तो, यह अपने उच्चारण से अलग है। – ovgolovin

0

एक और अजीब विकल्प है कि सूची के माध्यम से साइकिल पीछे की ओर पूरा किया जा सकता है। उदाहरण के लिए:

# Run this once 
myList = ['foo', 'bar', 'baz', 'boom'] 
myItem = 'baz' 

# Run this repeatedly to cycle through the list 
if myItem in myList: 
    myItem = myList[myList.index(myItem)-1] 
    print myItem 

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

  • कोई संबंधित समस्या नहीं^_^