Jawaban:
Jawaban lain hanya berfungsi untuk urutan.
Untuk setiap iterable, untuk melewati item pertama:
itercars = iter(cars)
next(itercars)
for car in itercars:
# do work
Jika Anda ingin melewati yang terakhir, Anda dapat melakukan:
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'
Untuk melewati elemen pertama dengan Python, Anda cukup menulis
for car in cars[1:]:
# Do What Ever you want
atau untuk melewatkan elem terakhir
for car in cars[:-1]:
# Do What Ever you want
Anda dapat menggunakan konsep ini untuk urutan apa pun.
Cara terbaik untuk melewatkan item pertama adalah:
from itertools import islice
for car in islice(cars, 1, None):
# do something
islice dalam hal ini dipanggil dengan titik awal 1, dan titik akhir Tidak ada, menandakan akhir dari iterator.
Untuk dapat melewati item dari akhir iterable, Anda harus mengetahui panjangnya (selalu mungkin untuk daftar, tetapi tidak harus untuk semua yang Anda bisa ulangi). misalnya, islice (mobil, 1, len (mobil) -1) akan melewati item pertama dan terakhir dalam daftar mobil.
islicecukup baik, tanpa mengetahui panjangnya atau menyimpan lebih banyak item dalam memori sekaligus daripada benar-benar diperlukan.
isliceadalah apa yang diteruskan ke deque, bukan seluruh iterator, dan hanya panjang dari jumlah item yang dilewati di akhir. Itu tidak menyimpan seluruh iterator dalam memori.
Berikut adalah fungsi generator yang lebih umum yang melewatkan sejumlah item dari awal dan akhir iterable:
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()
Contoh penggunaan:
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
at_end == 0.
skip(xrange(10000000), 1)akan digunakan at_end=0, jadi parameternya deque()adalah islice(it, 0), yang hanya akan mengkonsumsi nol elemen it. Ini tidak akan menghabiskan banyak memori.
for item in do_not_use_list_as_a_name[1:-1]:
#...do whatever
listsebagai nama variabel
listdapat diikat kembali. Itu sebabnya Anda tidak boleh , daripada tidak bisa , menggunakannya.
Berdasarkan @SvenMarnach's Answer, tetapi sedikit lebih sederhana dan tanpa menggunakan 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]
Juga Perhatikan, berdasarkan timeithasil saya , ini sedikit lebih cepat daripada solusi 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(), Anda masih membuat seluruh daftar dalam memori untuk generator, bukan? (Anda it1)
Contoh:
mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
print(i)
Dalam indeks python mulai dari 0, Kita bisa menggunakan slicing operator untuk membuat manipulasi dalam iterasi.
for i in range(1,-1):
Yah, sintaks Anda sebenarnya bukan Python.
Iterasi dalam Python adalah lebih dari isi kontainer (well, secara teknis ini lebih iterators), dengan sintaks for item in container. Dalam hal ini, wadah adalah carsdaftar, tetapi Anda ingin melewatkan elemen pertama dan terakhir, sehingga artinya cars[1:-1](daftar python berbasis nol, angka negatif dihitung dari akhir, dan :mengiris sintaksis.
Jadi kamu mau
for c in cars[1:-1]:
do something with c
Inilah pilihan yang saya sukai. Tidak perlu menambahkan banyak ke loop, dan hanya menggunakan alat bawaan.
Pergi dari:
for item in my_items:
do_something(item)
untuk:
for i, item in enumerate(my_items):
if i == 0:
continue
do_something(item)
Jika carsurutan Anda bisa lakukan
for car in cars[1:-1]:
pass
The more_itertoolsproyek meluas itertools.isliceuntuk menangani indeks negatif.
Contoh
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
Oleh karena itu, Anda dapat menerapkan elemen irisan dengan elegan antara item pertama dan terakhir dari iterable:
for car in mit.islice_extended(cars, 1, -1):
# do something
Saya melakukannya seperti ini, meskipun terlihat seperti retasan, ia berfungsi setiap saat:
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. Logikanya adalah bahwa ia menambahkan 'penghitung' untuk setiap nilai yang kemudian dapat Anda targetkan misalnyaif n == some_value. dalam contoh ini akan melakukan sesuatu untuk setiap instance dari saya, kecuali untuk yang pertama.