A
Antoon Pardon
Op 2005-12-11 said:Or, without creating the full list intermediately,Antoon said:I also think that other functions could benefit. For instance suppose
you want to iterate over every second element in a list. Sure you
can use an extended slice or use some kind of while. But why not
extend enumerate to include an optional slice parameter, so you could
do it as follows:
for el in enumerate(lst,::2)
'Why not'? Because it makes for a more complicated interface for something
you can already do quite easily.
Do you think so? This IMO should provide (0,lst[0]), (2,lst[2]),
(4,lst[4]) ...
I haven't found a way to do this easily. Except for something like:
start = 0:
while start < len(lst):
yield start, lst[start]
start += 2
But if you accept this, then there was no need for enumerate in the
first place. So eager to learn something new, how do you do this
quite easily?[(0, 'ham'), (2, 'bacon'), (4, 'foo'), (6, 'baz')]lst = ['ham','eggs','bacon','spam','foo','bar','baz']
list(enumerate(lst))[::2]
No changes to the language necessary.
[(0, 'ham'), (2, 'bacon'), (4, 'foo'), (6, 'baz')]lst = ['ham','eggs','bacon','spam','foo','bar','baz']
import itertools
list(itertools.islice(enumerate(lst), 0, None, 2))
As far as I understand use of this idiom can turn an O(n)
algorithm into an O(n^2) algorithm.
Suppose I have a list with 10 000 elements and I want
the sum of the first 100, the sum of the second 100 ...
One way to do that would be:
for i in xrange(0,10000,100):
sum(itertools.islice(lst, i, i+100))
But itertools.islice would each time start from the begining
of the list and iterate over i elements before giving 100
elements to sum. Which would make this implementation O(n^2)
instead of O(n).