Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correct way to iterate twice over a list?

Tags:

python

What is the correct way to perform multiple iteration over a container? From python documentation:

Iterator - A container object (such as a list) produces a fresh new iterator each time you pass it to the iter() function or use it in a for loop. Attempting this with an iterator will just return the same exhausted iterator object used in the previous iteration pass, making it appear like an empty container.

The intention of the protocol is that once an iterator’s next() method raises StopIteration, it will continue to do so on subsequent calls. Implementations that do not obey this property are deemed broken. (This constraint was added in Python 2.3; in Python 2.2, various iterators are broken according to this rule.)

If I have this code:

slist = [1,2,3,4]
rlist = reversed(slist)
list(rlist)
#[4,3,2,1]
tuple(rlist)
#()

What would be the easiest and most correct way to iterate over 'rlist' twice?

like image 520
Paul Chen Avatar asked Apr 19 '13 15:04

Paul Chen


People also ask

How do you iterate over two or more lists at the same time?

Iterate over multiple lists at a time We can iterate over lists simultaneously in ways: zip() : In Python 3, zip returns an iterator. zip() function stops when anyone of the list of all the lists gets exhausted. In simple words, it runs till the smallest of all the lists.

How do you iterate through a list in Python 2 times?

rlist = list(reversed(slist)) # we store the result of the first iteration # and then that result can be iterated over multiple times. If you really must not store the items, try itertools. tee . But note that you won't really avoid storing the items if you need to complete one full iteration before starting the next.

Can you use an iterator twice?

Iterators can generally not be iterated twice because there might be a cost to their iteration. In the case of str::lines , each iteration needs to find the next end of line, which means scanning through the string, which has some cost.

How do you iterate a function over a list?

We can iterate through a list by using the range() function and passing the length of the list. It will return the index from 0 till the end of the list.


1 Answers

rlist = list(reversed(slist))

Then iterate as often as you want. This trick applies more generally; whenever you need to iterate over an iterator multiple times, turn it into a list. Here's a code snippet that I keep copy-pasting into different projects for exactly this purpose:

def tosequence(it):
    """Turn iterable into a sequence, avoiding a copy if possible."""
    if not isinstance(it, collections.Sequence):
        it = list(it)
    return it

(Sequence is the abstract type of lists, tuples and many custom list-like objects.)

like image 120
Fred Foo Avatar answered Sep 24 '22 00:09

Fred Foo