在python中,我该怎么做:
for car in cars:
# Skip first and last, do work for rest
答案 0 :(得分:293)
要跳过Python中的第一个元素,您只需编写
即可for car in cars[1:]:
# Do What Ever you want
或跳过最后一个元素
for car in cars[:-1]:
# Do What Ever you want
您可以将此概念用于任何序列。
答案 1 :(得分:207)
其他答案仅适用于序列。
对于任何可迭代的,跳过第一项:
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'
答案 2 :(得分: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()
使用示例:
>>> list(skip(range(10), at_start=2, at_end=2))
[2, 3, 4, 5, 6, 7]
答案 3 :(得分:18)
跳过第一项的最佳方法是:
from itertools import islice
for car in islice(cars, 1, None):
# do something
在这种情况下,islice的起始点为1,结束点为None,表示迭代器的结束。
为了能够从可迭代的末尾跳过项目,您需要知道它的长度(总是可以用于列表,但不一定是您可以迭代的所有内容)。例如,islice(cars,1,len(cars)-1)将跳过汽车列表中的第一个和最后一个项目。
答案 4 :(得分:7)
for item in do_not_use_list_as_a_name[1:-1]:
#...do whatever
答案 5 :(得分:3)
基于@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
答案 6 :(得分:3)
要list
跳过第一个项,您可以使用:
for l in lines[1:]:
print(l)
或next ()
:
for l in lines:
next()
print(l)
答案 7 :(得分:2)
嗯,你的语法不是Python的开头。
Python中的迭代超过了容器的内容(从技术上来说,它超过了迭代器),语法为for item in container
。在这种情况下,容器是cars
列表,但是您想要跳过第一个和最后一个元素,这意味着cars[1:-1]
(python列表从零开始,负数从最后开始计算,并且:
正在切割语法。
所以你想要
for c in cars[1:-1]:
do something with c
答案 8 :(得分:2)
另一种方法:
for idx, car in enumerate(cars):
# Skip first line.
if not idx:
continue
# Skip last line.
if idx + 1 == len(cars):
continue
# Real code here.
print car
答案 9 :(得分:1)
如果cars
是一个你可以做的序列
for car in cars[1:-1]:
pass
答案 10 :(得分:0)
我是这样做的,即使它看起来像每次都有效的黑客:
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
答案 11 :(得分:0)
more_itertools
项目扩展itertools.islice
以处理负指数。
实施例
import more_itertools as mit
iterable = 'ABCDEFGH'
list(mit.islice_extended(iterable, 1, -1))
# Out: ['B', 'C', 'D', 'E', 'F', 'G']
因此,您可以优雅地将切片元素应用于可迭代的第一个和最后一个项目之间:
for car in mit.islice_extended(cars, 1, -1):
# do something
答案 12 :(得分:0)
这是我的首选。不需要在循环上添加太多内容,只需要使用内置工具即可。
来自:
for item in my_items:
do_something(item)
收件人:
for i, item in enumerate(my_items):
if i == 0:
continue
do_something(item)
答案 13 :(得分:0)
示例:
mylist=['one'.'two','three'.'four'.'five']
for i in mylist[1:]:
print(i)
在python索引从0开始的情况下,我们可以使用切片运算符在迭代中进行操作。
for i in range(1,-1):