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?


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.


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):
    ...

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.


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

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

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

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

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 )
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.