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.