Bắt đầu lập chỉ mục để lặp lại danh sách Python


88

Cách tốt nhất để đặt chỉ mục bắt đầu khi lặp lại danh sách trong Python là gì. Ví dụ: tôi có danh sách các ngày trong tuần - Chủ nhật, Thứ Hai, Thứ Ba, ... Thứ Bảy - nhưng tôi muốn lặp lại danh sách bắt đầu từ Thứ Hai. Cách tốt nhất để làm điều này là gì?


1
Bạn chỉ muốn lặp lại cho đến thứ Bảy, hay bạn muốn nó kết thúc và in Chủ nhật tuần trước?
juanchopanza

Tôi chỉ muốn lặp lại cho đến thứ bảy. Tôi đã không nhận ra cho đến bây giờ rằng bạn có thể sử dụng cắt trong danh sách Python.
Vincent Catalano

có giải pháp nào xử lý các trình tạo / lặp lại và không chỉ danh sách không? Hay danh sách thực sự lớn?
Charlie Parker

Câu trả lời:


174

Bạn có thể sử dụng phương pháp cắt lát :

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

Điều này sẽ bắt đầu ở phần tử thứ ba và lặp lại đến cuối.


2
Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn!
Vincent Catalano

30
Điều này không hiệu quả đối với danh sách lớn? Tôi tin rằng thao tác lát này phải sao chép các phần tử danh sách đang được tham chiếu vào một danh sách mới.
UndeadKernel

4
Có, điều này không hiệu quả đối với danh sách lớn. Xem câu trả lời gnibblers bên dưới để biết giải pháp không sao chép.
Björn Pollex

làm thế nào để bạn làm điều này mặc dù nếu bạn đang lặp lại bằng cách sử dụng một trình tạo / lặp lại?
Charlie Parker

2
Bạn nên sử dụng islice, như được đề xuất trong câu trả lời của John La Rooy.
Björn Pollex

50

islice có lợi thế là nó không cần sao chép một phần của danh sách

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

13

Bạn luôn có thể lặp lại bằng cách sử dụng bộ đếm chỉ mục theo kiểu lặp C thông thường:

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

Luôn luôn tốt hơn nếu làm theo kiểu "lặp lại trên mọi phần tử" vì đó là điều bình thường để làm, nhưng nếu nó cản trở bạn, chỉ cần nhớ kiểu thông thường cũng được hỗ trợ, luôn luôn.


9

stdlib sẽ nối bạn với con trai!

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

Nếu tất cả các bạn muốn là in từ Mondaytrở đi, bạn có thể sử dụng list's indexphương pháp để tìm ra vị trí mà 'Monday' là trong danh sách, và lặp từ đó như được giải thích trong bài viết khác. Việc sử dụng list.indexgiúp bạn tiết kiệm mã hóa chỉ mục cho "Thứ Hai", đây là một nguồn lỗi tiềm ẩn:

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

giải pháp thực sự tốt đẹp!
aderchox

3

Đây là một trình tạo xoay vòng không cần tạo bản sao bị vênh của chuỗi đầu vào ... có thể hữu ích nếu chuỗi đầu vào lớn hơn 7 mục.

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

Có - và sẽ dễ dàng mở rộng để tạo ra một chuỗi lặp lại vô hạn.
slothrop

không thể không cảm ơn @JohnMachin: công việc tuyệt vời cho một người đã chết trong 264 năm này
jjon 22/09/15

1

Tại sao mọi người đang sử dụng tính năng cắt danh sách (chậm vì nó sao chép sang danh sách mới), nhập hàm thư viện hoặc cố gắng xoay một mảng cho việc này?

Sử dụng vòng lặp for thông thường với range(start, stop, step)(ở đâu startsteplà các đối số tùy chọn).

Ví dụ: lặp qua một mảng bắt đầu từ chỉ mục 1:

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

0

Nếu bạn muốn "xoay quanh" và xoay danh sách một cách hiệu quả để bắt đầu với Thứ Hai (thay vì chỉ cắt nhỏ các mục trước Thứ Hai):

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 )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.