Python listesini yinelemek için başlangıç ​​dizini


90

Python'da bir listeyi yinelerken bir başlangıç ​​dizini belirlemenin en iyi yolu nedir? Örneğin, haftanın günlerinin bir listesi var - Pazar, Pazartesi, Salı, ... Cumartesi - ancak Pazartesi'den başlayarak listeyi yinelemek istiyorum. Bunu yapmak için en iyi uygulama nedir?


1
Sadece Cumartesi gününe kadar döngü mü yapmak istiyorsunuz, yoksa son Pazar gününü sarmalayıp yazdırmasını mı istiyorsunuz?
juanchopanza

Cumartesi gününe kadar döngü yapmak istedim. Python listelerinde dilimlemeyi kullanabileceğinizi şimdiye kadar fark etmemiştim.
Vincent Catalano

Sadece listeleri değil, üreteçleri / yinelemeleri de ele alan bir çözüm var mı? Yoksa gerçekten büyük listeler mi?
Charlie Parker

Yanıtlar:


177

Dilimlemeyi kullanabilirsiniz :

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

Bu, üçüncü öğede başlayacak ve sonuna kadar yinelenecektir.


2
Bu tam olarak aradığım şeydi. Teşekkürler!
Vincent Catalano

30
Bu büyük listeler için verimsiz değil mi? Bu dilim işleminin referans verilen liste öğelerini yeni bir listeye kopyalamak zorunda olduğuna inanıyorum.
UndeadKernel

4
Evet, bu büyük listeler için verimsizdir. Kopyalamayan bir çözüm için aşağıdaki gnibblers yanıtına bakın.
Björn Pollex

bir üreteç / yineleyici kullanarak döngü yapıyorsanız bunu nasıl yaparsınız?
Charlie Parker

2
isliceJohn La Rooy'un cevabında önerildiği gibi kullanmalısınız .
Björn Pollex

52

islice listenin bir bölümünü kopyalamaya gerek olmaması avantajına sahiptir

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

13

Her zaman geleneksel C tarzı döngüde bir dizin sayacı kullanarak döngü yapabilirsiniz:

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

"Her öğe üzerinde döngü" stilini takip etmek her zaman daha iyidir, çünkü bu normal bir şeydir, ancak yolunuza çıkarsa, her zaman geleneksel stilin de desteklendiğini unutmayın.


9

stdlib seni bağlayacak oğlum!

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

İstediğiniz tek şey bundan sonra yazdırmaksa, "Pazartesi" nin listede olduğu konumu bulmak için 'ın yöntemini Mondaykullanabilir ve diğer gönderilerde açıklandığı gibi oradan yineleme yapabilirsiniz. Kullanmak , sizi potansiyel bir hata kaynağı olan "Pazartesi" dizini sabit kodlamadan kurtarır:listindexlist.index

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

gerçekten güzel çözüm!
aderchox

3

Giriş sırasının çarpık bir kopyasını oluşturması gerekmeyen bir dönüş üreteci ... giriş sırası 7 maddeden çok daha büyükse faydalı olabilir.

>>> 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']
>>>

Evet - ve sonsuz tekrarlayan bir dizi oluşturmak için genişletilmesi kolay olacaktır.
slothrop

@JohnMachin'e teşekkür etmekten yardımcı olamıyorum: 264 yılda ölen biri için harika iş
jjon

1

İnsanlar neden liste dilimlemeyi kullanıyor (yeni bir listeye kopyaladığı için yavaş), bir kitaplık işlevini içe aktarıyor veya bunun için bir diziyi döndürmeye çalışıyor?

İle normal bir for-döngüsü kullanın range(start, stop, step)(burada startve stepisteğe bağlı argümanlar).

Örneğin, dizin 1'den başlayan bir dizide döngü yapmak:

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

0

Listeyi Pazartesi'den başlayacak şekilde "özetlemek" ve etkili bir şekilde döndürmek istiyorsanız (öğeleri Pazartesiden önce kesmek yerine):

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 )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.