Pythonでは、次のようなことをするにはどうすればよいですか:
for car in cars:
# Skip first and last, do work for rest
Pythonでは、次のようなことをするにはどうすればよいですか:
for car in cars:
# Skip first and last, do work for rest
他の答えは、シーケンスに対してのみ機能します。
イテラブルの場合、最初の項目をスキップするには:
itercars = iter(cars)
next(itercars)
for car in itercars:
# do work
最後をスキップしたい場合は、次のようにします。
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'
最初の項目をスキップする最良の方法は次のとおりです。
from itertools import islice
for car in islice(cars, 1, None):
pass
# do something
islice
1
この場合、 の開始点と の終了点で呼び出され、None
の終了を示しiterable
ます。
の最後からアイテムをスキップできるようにするには、iterable
その長さを知る必要があります (リストでは常に可能ですが、反復できるすべてのものである必要はありません)。たとえば、islice(cars, 1, len(cars)-1)
の最初と最後の項目をスキップしcars
ます。
これは、反復可能オブジェクトの最初と最後から任意の数の項目をスキップする、より一般的なジェネレーター関数です。
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(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
for item in list_name[1:-1]:
#...do whatever
これが私の好みの選択です。ループに多くを追加する必要はなく、組み込みツールのみを使用します。
から行く:
for item in my_items:
do_something(item)
に:
for i, item in enumerate(my_items):
if i == 0:
continue
do_something(item)
ええと、あなたの構文はそもそも Python ではありません。
Python でのイテレーションは、構文for item in container
. この場合、コンテナーはcars
リストですが、最初と最後の要素をスキップする必要があるため、つまりcars[1:-1]
(python リストは 0 ベースで、負の数は末尾からカウントし、:
構文をスライスしています。
あなたが望んでいるのは
for c in cars[1:-1]:
do something with c
@SvenMarnach の回答に基づいていますが、少し単純で 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]
また、私の結果に基づいてtimeit
、これは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
あなたcars
ができるシーケンスである場合
for car in cars[1:-1]:
pass
ハックのように見えますが、毎回機能します。
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