Mulai indeks untuk mengulang daftar Python

90

Apa cara terbaik untuk mengatur indeks awal saat mengulang daftar dengan Python. Misalnya, saya memiliki daftar hari dalam seminggu - Minggu, Senin, Selasa, ... Sabtu - tetapi saya ingin mengulang daftar mulai hari Senin. Apa praktik terbaik untuk melakukan ini?

Vincent Catalano
sumber
1
Apakah Anda hanya ingin mengulang sampai hari Sabtu, atau Anda ingin membungkusnya dan mencetaknya pada hari Minggu terakhir?
juanchopanza
Saya hanya ingin mengulang sampai hari Sabtu. Saya tidak menyadari sampai sekarang bahwa Anda dapat menggunakan mengiris dalam daftar Python.
Vincent Catalano
apakah ada solusi yang berhubungan dengan generator / iterable juga dan tidak hanya daftar? Atau daftar yang sangat besar?
Charlie Parker

Jawaban:

177

Anda bisa menggunakan mengiris :

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

Ini akan dimulai dari elemen ketiga dan berulang sampai akhir.

Björn Pollex
sumber
2
Inilah yang saya cari. Terima kasih!
Vincent Catalano
30
Bukankah ini tidak efisien untuk daftar besar? Saya yakin operasi slice ini harus menyalin elemen daftar yang direferensikan ke daftar baru.
UndeadKernel
4
Ya, ini tidak efisien untuk daftar besar. Lihat jawaban gnibbler di bawah untuk solusi yang tidak menyalin.
Björn Pollex
bagaimana Anda melakukan ini meskipun jika u perulangan menggunakan generator / iterables?
Charlie Parker
2
Anda harus menggunakan islice, seperti yang disarankan dalam jawaban John La Rooy.
Björn Pollex
52

islice memiliki keuntungan karena tidak perlu menyalin bagian dari daftar

from itertools import islice
for day in islice(days, 1, None):
    ...
John La Rooy
sumber
13

Anda selalu dapat melakukan perulangan menggunakan penghitung indeks perulangan gaya C konvensional:

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

Itu selalu lebih baik untuk mengikuti gaya "loop pada setiap elemen" karena itu adalah hal yang normal untuk dilakukan, tetapi jika menghalangi jalan Anda, ingat saja gaya konvensional juga didukung, selalu.

Lakshman Prasad
sumber
9

stdlib akan menghubungkanmu nak!

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'])
synthesizerpatel
sumber
4

Jika semua yang Anda inginkan adalah untuk mencetak dari Mondayseterusnya, Anda dapat menggunakan list's indexmetode untuk menemukan posisi di mana 'Senin' adalah dalam daftar, dan iterate dari sana seperti yang dijelaskan dalam posting lain. Penggunaan akan list.indexmenghemat pengodean indeks untuk "Monday", yang merupakan sumber kesalahan potensial:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d
juanchopanza
sumber
solusi yang sangat bagus!
aderchox
3

Berikut generator rotasi yang tidak perlu membuat salinan melengkung dari urutan masukan ... mungkin berguna jika urutan masukan jauh lebih besar dari 7 item.

>>> 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']
>>>
John Machin
sumber
Ya - dan akan mudah diperluas untuk menghasilkan urutan berulang yang tak terbatas.
slothrop
tidak bisa tidak berterima kasih kepada @JohnMachin: kerja bagus untuk seseorang yang sudah mati selama 264 tahun ini
jjon
1

Mengapa orang menggunakan pemotongan daftar (lambat karena menyalin ke daftar baru), mengimpor fungsi pustaka, atau mencoba memutar array untuk ini?

Gunakan for-loop normal dengan range(start, stop, step)(di mana startdan stepmerupakan argumen opsional).

Misalnya, melakukan perulangan melalui array yang dimulai dari indeks 1:

for i in range(1, len(arr)):
    print(arr[i])
Charlie Su
sumber
0

Jika Anda ingin "menyelesaikan" dan memutar daftar secara efektif untuk memulai dengan hari Senin (bukan hanya memotong item sebelum hari Senin):

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 )
slothrop
sumber