Câu trả lời:
Các câu trả lời khác chỉ hoạt động cho một chuỗi.
Đối với bất kỳ lần lặp nào, bỏ qua mục đầu tiên:
itercars = iter(cars)
next(itercars)
for car in itercars:
# do work
Nếu bạn muốn bỏ qua lần cuối, bạn có thể làm:
itercars = iter(cars)
# add 'next(itercars)' here if you also want to skip the first
prev = next(itercars)
for car in itercars:
# do work on 'prev' not 'car'
# at end of loop:
prev = car
# now you can do whatever you want to do to the last one on 'prev'
Để bỏ qua phần tử đầu tiên trong Python, bạn chỉ cần viết
for car in cars[1:]:
# Do What Ever you want
hoặc bỏ qua elem cuối cùng
for car in cars[:-1]:
# Do What Ever you want
Bạn có thể sử dụng khái niệm này cho bất kỳ trình tự.
Cách tốt nhất để bỏ qua (các) mục đầu tiên là:
from itertools import islice
for car in islice(cars, 1, None):
# do something
islice trong trường hợp này được gọi với điểm bắt đầu là 1 và điểm kết thúc là Không, biểu thị sự kết thúc của trình vòng lặp.
Để có thể bỏ qua các mục từ cuối của một lần lặp, bạn cần biết độ dài của nó (luôn luôn có thể cho một danh sách, nhưng không nhất thiết cho tất cả mọi thứ bạn có thể lặp lại). ví dụ, islice (ô tô, 1, len (ô tô) -1) sẽ bỏ qua các mục đầu tiên và cuối cùng trong danh sách ô tô.
islice
khá tốt, mà không biết độ dài hoặc lưu trữ nhiều vật phẩm trong bộ nhớ cùng một lúc là hoàn toàn cần thiết.
islice
là những gì được truyền cho deque
, không phải toàn bộ vòng lặp và nó chỉ là độ dài của số lượng vật phẩm cần bỏ qua ở cuối. Nó không lưu trữ toàn bộ iterator trong bộ nhớ.
Đây là một hàm tạo tổng quát hơn bỏ qua bất kỳ số lượng mục nào từ đầu và cuối của một lần lặp:
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
for x in itertools.islice(it, at_start):
pass
queue = collections.deque(itertools.islice(it, at_end))
for x in it:
queue.append(x)
yield queue.popleft()
Ví dụ sử dụng:
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
at_end == 0
.
skip(xrange(10000000), 1)
sẽ sử dụng at_end=0
, vì vậy tham số deque()
sẽ là islice(it, 0)
, sẽ chỉ tiêu thụ các phần tử bằng không it
. Điều này sẽ không chiếm nhiều bộ nhớ.
for item in do_not_use_list_as_a_name[1:-1]:
#...do whatever
list
làm tên biến
list
có thể được ràng buộc lại. Đó là lý do tại sao bạn không nên , thay vì không thể , sử dụng nó.
Dựa trên Câu trả lời của @SvenMarnach, nhưng đơn giản hơn một chút và không sử dụng deque
>>> def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
it = itertools.islice(it, at_start, None)
it, it1 = itertools.tee(it)
it1 = itertools.islice(it1, at_end, None)
return (next(it) for _ in it1)
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
>>> list(skip(range(10), at_start=2, at_end=5))
[2, 3, 4]
Cũng lưu ý, dựa trên timeit
kết quả của tôi , điều này nhanh hơn một chút so với giải pháp deque
>>> iterable=xrange(1000)
>>> stmt1="""
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
it = itertools.islice(it, at_start, None)
it, it1 = itertools.tee(it)
it1 = itertools.islice(it1, at_end, None)
return (next(it) for _ in it1)
list(skip(iterable,2,2))
"""
>>> stmt2="""
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)
for x in itertools.islice(it, at_start):
pass
queue = collections.deque(itertools.islice(it, at_end))
for x in it:
queue.append(x)
yield queue.popleft()
list(skip(iterable,2,2))
"""
>>> timeit.timeit(stmt = stmt1, setup='from __main__ import iterable, skip, itertools', number = 10000)
2.0313770640908047
>>> timeit.timeit(stmt = stmt2, setup='from __main__ import iterable, skip, itertools, collections', number = 10000)
2.9903135454296716
tee()
, bạn vẫn đang tạo toàn bộ danh sách trong bộ nhớ cho trình tạo, phải không? (của bạn it1
)
Thí dụ:
mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
print(i)
Trong chỉ mục python bắt đầu từ 0, Chúng ta có thể sử dụng toán tử cắt để thực hiện các thao tác lặp.
for i in range(1,-1):
Chà, cú pháp của bạn không thực sự là Python để bắt đầu.
Lặp đi lặp lại trong Python là nội dung của các container (tốt, về mặt kỹ thuật, nó là trên các trình vòng lặp), với một cú pháp for item in container
. Trong trường hợp này, container là cars
danh sách, nhưng bạn muốn bỏ qua các phần tử đầu tiên và cuối cùng, vì vậy điều đó có nghĩa là cars[1:-1]
(danh sách python là dựa trên số không, số âm được tính từ cuối và :
đang cắt cú pháp.
Vậy bạn muốn
for c in cars[1:-1]:
do something with c
Một phương pháp khác:
for idx, car in enumerate(cars):
# Skip first line.
if not idx:
continue
# Skip last line.
if idx + 1 == len(cars):
continue
# Real code here.
print car
Nếu cars
là một chuỗi bạn chỉ có thể làm
for car in cars[1:-1]:
pass
Các more_itertools
dự án mở rộng itertools.islice
để xử lý các chỉ số tiêu cực.
Thí dụ
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
Do đó, bạn có thể áp dụng nó một cách tao nhã các phần tử giữa các mục đầu tiên và cuối cùng của một lần lặp:
for car in mit.islice_extended(cars, 1, -1):
# do something
Tôi làm như thế này, mặc dù nó trông giống như một bản hack nhưng nó hoạt động mọi lúc:
ls_of_things = ['apple', 'car', 'truck', 'bike', 'banana']
first = 0
last = len(ls_of_things)
for items in ls_of_things:
if first == 0
first = first + 1
pass
elif first == last - 1:
break
else:
do_stuff
first = first + 1
pass
for n, i in enumerate(cars): if n!= 0: do something to i
. logic là nó thêm một 'bộ đếm' cho mỗi giá trị mà sau đó bạn có thể nhắm mục tiêu, ví dụ như vớiif n == some_value
. trong ví dụ này, nó sẽ làm một cái gì đó cho từng phiên bản của i, ngoại trừ trường hợp đầu tiên.