231

Pythonでは、次のようなことをするにはどうすればよいですか:

for car in cars:
   # Skip first and last, do work for rest
4

13 に答える 13

453

Python で最初の要素をスキップするには、単純に次のように記述します。

for car in cars[1:]:
    # Do What Ever you want

または最後の要素をスキップする

for car in cars[:-1]:
    # Do What Ever you want

この概念は、任意のものに使用できますsequence(ただし、任意のものではありませiterableん)。

于 2012-04-09T20:16:57.183 に答える
309

他の答えは、シーケンスに対してのみ機能します。

イテラブルの場合、最初の項目をスキップするには:

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'
于 2012-04-09T20:17:58.137 に答える
41

最初の項目をスキップする最良の方法は次のとおりです。

from itertools import islice
for car in islice(cars, 1, None):
    pass
    # do something

islice1この場合、 の開始点と の終了点で呼び出され、Noneの終了を示しiterableます。

の最後からアイテムをスキップできるようにするには、iterableその長さを知る必要があります (リストでは常に可能ですが、反復できるすべてのものである必要はありません)。たとえば、islice(cars, 1, len(cars)-1)の最初と最後の項目をスキップしcarsます。

于 2012-10-16T09:23:05.857 に答える
29

これは、反復可能オブジェクトの最初と最後から任意の数の項目をスキップする、より一般的なジェネレーター関数です。

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]
于 2012-04-09T21:06:32.293 に答える
11
for item in list_name[1:-1]:
    #...do whatever
于 2012-04-09T20:16:50.097 に答える
4

これが私の好みの選択です。ループに多くを追加する必要はなく、組み込みツールのみを使用します。

から行く:

for item in my_items:
  do_something(item)

に:

for i, item in enumerate(my_items):
  if i == 0:
    continue
  do_something(item)
于 2019-06-28T22:41:03.880 に答える
3

ええと、あなたの構文はそもそも Python ではありません。

Python でのイテレーションは、構文for item in container. この場合、コンテナーはcarsリストですが、最初と最後の要素をスキップする必要があるため、つまりcars[1:-1](python リストは 0 ベースで、負の数は末尾からカウントし、:構文をスライスしています。

あなたが望んでいるのは

for c in cars[1:-1]:
    do something with c
于 2012-04-09T20:22:52.677 に答える
2

@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
于 2013-09-16T20:21:44.167 に答える
1

あなたcarsができるシーケンスである場合

for car in cars[1:-1]:
    pass
于 2012-04-09T20:17:17.673 に答える
-1

ハックのように見えますが、毎回機能します。

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
于 2016-12-20T16:20:29.643 に答える