Skip first entry in for loop in python?

前端 未结 13 2475
面向向阳花
面向向阳花 2020-12-02 05:15

In python, How do I do something like:

for car in cars:
   # Skip first and last, do work for rest
13条回答
  •  死守一世寂寞
    2020-12-02 06:02

    Based on @SvenMarnach 's Answer, but bit simpler and without using 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]
    

    Also Note, based on my timeit result, this is marginally faster than the deque solution

    >>> 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
    

提交回复
热议问题