Yanıtlar:
Diğer cevaplar sadece bir dizi için geçerlidir.
Herhangi bir yinelenebilir için, ilk öğeyi atlamak için:
itercars = iter(cars)
next(itercars)
for car in itercars:
# do work
Sonuncuyu atlamak istiyorsanız şunları yapabilirsiniz:
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'
Python'daki ilk öğeyi atlamak için
for car in cars[1:]:
# Do What Ever you want
veya son elem atlamak için
for car in cars[:-1]:
# Do What Ever you want
Bu konsepti herhangi bir sekans için kullanabilirsiniz.
İlk kalemleri atlamanın en iyi yolu:
from itertools import islice
for car in islice(cars, 1, None):
# do something
bu durumda islice, yineleyicinin sonunu gösteren 1 başlangıç noktası ve None son noktası ile çağrılır.
Bir yinelenebilir öğenin sonundan öğeleri atlayabilmek için, uzunluğunu bilmeniz gerekir (bir liste için her zaman mümkündür, ancak yineleyebileceğiniz her şey için zorunlu değildir). örneğin, islice (arabalar, 1, len (arabalar) -1), otomobil listesindeki ilk ve son öğeleri atlar.
isliceUzunluğunu bilmeden veya bir kerede kesinlikle gerekli olandan daha fazla öğe depolamaksızın, yinelenebilir herhangi bir öğenin başında ve / veya sonunda rastgele sayıda öğenin atlanmasını kapsar .
islice, dequetüm yineleyiciye değil , iletilen öğedir ve sonunda atlanacak öğe sayısının uzunluğudur. Tüm yineleyiciyi belleğe kaydetmez.
İşte bir yinelenebilir başlangıcından ve sonundan istediğiniz sayıda öğeyi atlayan daha genel bir jeneratör işlevi:
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()
Örnek kullanım:
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
at_end == 0.
skip(xrange(10000000), 1)kullanacak at_end=0, bu yüzden sadece sıfır elemanını tüketecek parametre deque()olacak . Bu çok fazla bellek kaplamaz. islice(it, 0)it
for item in do_not_use_list_as_a_name[1:-1]:
#...do whatever
listDeğişken adı olarak kullanmayın
listyeniden bağlanabilir. Eğer bu yüzden olmamalı yerine edemez , onu kullanın.
Misal:
mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
print(i)
Python indeksinde 0'dan başlar, yinelemede manipülasyonlar yapmak için dilimleme operatörünü kullanabiliriz.
for i in range(1,-1):
@SvenMarnach kullanıcısının Yanıtına dayanarak, biraz daha basit ve deque kullanmadan
>>> 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]
Ayrıca Not, benim timeitsonucuma göre, bu deque çözümden biraz daha hızlı
>>> 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(), hala jeneratör için belleğin bir listesini oluşturuyorsunuz, değil mi? (senin it1)
Sözdiziminiz aslında Python değil.
Python'daki yinelemeler, sözdizimi ile kapların içeriğidir (teknik olarak yineleyiciler üzerindedir) for item in container. Bu durumda, kap carslistedir, ancak ilk ve son öğeleri atlamak istiyorsunuz, yani cars[1:-1](python listeleri sıfır tabanlı, negatif sayılar sondan sayılıyor ve :sözdizimini dilimliyor.
Yani istiyorsun
for c in cars[1:-1]:
do something with c
İşte tercih ettiğim seçim. Döngüye fazla bir şey eklemeyi gerektirmez ve yerleşik araçlardan başka bir şey kullanmaz.
Git:
for item in my_items:
do_something(item)
için:
for i, item in enumerate(my_items):
if i == 0:
continue
do_something(item)
Eğer carsbir dizi ise sadece
for car in cars[1:-1]:
pass
more_itertoolsProje uzanır itertools.isliceolumsuz endekslerini işlemek için.
Misal
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
Bu nedenle, dilim öğelerini bir yinelenebilir öğenin ilk ve son öğeleri arasında zarif bir şekilde uygulayabilirsiniz:
for car in mit.islice_extended(cars, 1, -1):
# do something
for n, i in enumerate(cars): if n!= 0: do something to i. mantık, daha sonra hedefleyebileceğiniz her değere bir 'sayaç' eklemesidirif n == some_value. bu örnekte, ilki dışında i'nin her örneğine bir şeyler yapar.