在python中跳过for循环的第一个条目?

Rol*_*ndo 163 python

在python中,我该怎么做:

for car in cars:
   # Skip first and last, do work for rest
Run Code Online (Sandbox Code Playgroud)

Abh*_*jit 322

要跳过Python中的第一个元素,您可以简单地编写

for car in cars[1:]:
    # Do What Ever you want
Run Code Online (Sandbox Code Playgroud)

或跳过最后一个元素

for car in cars[:-1]:
    # Do What Ever you want
Run Code Online (Sandbox Code Playgroud)

您可以将此概念用于任何序列.

  • 不适用于所有[iterables](http://docs.python.org//glossary.html#term-iterable),但适用于所有[序列](http://docs.python.org//glossary.html#term -序列). (49认同)
  • 内存使用情况如何?切片是否会制作子序列的新副本? (3认同)
  • @Voyager 是的,它确实制作了新副本。 (3认同)

agf*_*agf 236

其他答案仅适用于序列.

对于任何可迭代的,跳过第一项:

itercars = iter(cars)
next(itercars)
for car in itercars:
    # do work
Run Code Online (Sandbox Code Playgroud)

如果你想跳过最后一个,你可以这样做:

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'
Run Code Online (Sandbox Code Playgroud)

  • 我发现做cars.pop(0) 和cars.pop() 效果很好。 (2认同)

Roe*_*erg 24

跳过第一项的最佳方法是:

from itertools import islice
for car in islice(cars, 1, None):
    # do something
Run Code Online (Sandbox Code Playgroud)

在这种情况下,islice的起始点为1,结束点为None,表示迭代器的结束.

为了能够从可迭代的末尾跳过项目,您需要知道它的长度(总是可以列出一个列表,但不一定是您可以迭代的所有内容).例如,islice(cars,1,len(cars)-1)将跳过汽车列表中的第一个和最后一个项目.

  • `islice`是传递给`deque`的东西,而不是整个迭代器,它只是最后要跳过的项目数的长度.它不会将整个迭代器存储在内存中. (2认同)

Sve*_*ach 23

这是一个更通用的生成器函数,它从可迭代的开头和结尾跳过任意数量的项:

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()
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

  • @RoeeShenberg:`skip(xrange(10000000),1)`将使用`at_end = 0`,因此`deque()`的参数将是`islice(it,0)`,它只会消耗零元素` it`.这不会占用大量内存. (3认同)

Kur*_*tal 8

for item in do_not_use_list_as_a_name[1:-1]:
    #...do whatever
Run Code Online (Sandbox Code Playgroud)

  • 它实际上并不是_reserved_; 名称`list`可以重新绑定.这就是为什么你_不应该_而不是_can't_,使用它. (5认同)
  • 不要使用`list`作为变量名 (3认同)
  • OP只想跳过第一个元素。为什么:-1? (2认同)

Ton*_*ose 6

例子:

mylist=['one','two','three','four','five']
for i in mylist[1:]:
   print(i)
Run Code Online (Sandbox Code Playgroud)

在python索引从0开始,我们可以使用切片运算符在迭代中进行操作。

for i in range(1,-1):
Run Code Online (Sandbox Code Playgroud)


man*_*ter 5

这是我的首选。它不需要在循环中添加太多内容,并且只使用内置工具。

从...来:

for item in my_items:
  do_something(item)
Run Code Online (Sandbox Code Playgroud)

到:

for i, item in enumerate(my_items):
  if i == 0:
    continue
  do_something(item)
Run Code Online (Sandbox Code Playgroud)