I am newbie who can explain this code to me?

Peter Otten __peter__ at web.de
Tue Sep 20 16:15:16 EDT 2016


Nobody wrote:

> On Tue, 20 Sep 2016 15:12:39 +0200, Peter Otten wrote:
> 
>> because they don't build lists only to throw them away.
> 
> The lists could have been avoided by using iterators, e.g.
> 
> import itertools as it
> keys = xrange(256)
> vals = it.imap(chr, keys)
> max(it.imap(operator.setitem, it.repeat(d), keys, vals))
> 
>> Also, creating a list of dicts or lists is a common gotcha because after
>> 
>> outer = [[]] * 3
>> 
>> the outer list contains *the* *same* list three times, not three empty
>> lists.
> 
> But in this case, it's not a gotcha; 

Remember that the OP is a newbie

> it's intentional 

and the author of the original example is trying to be clever, but in my 
eyes doesn't succeed.

> that each iteration
> operates upon the same dictionary.
> 
> Essentially, [d]*len(keys) is a trick to get around the fact that map()
> requires all of the arguments (apart from the function) to be sequences.
> 
> itertools.repeat() is possibly a better trick, although then you can't use
> map(), because map() iterates until *all* sequences are exhausted,
> appending None values for shorter sequences. itertools.imap() terminates
> once the shortest sequence is exhausted.
> 
> In this specific case, a loop or comprehension would have been better. But
> in situations where you don't control the iteration, the ability to coerce
> something into a pre-determined iteration pattern is useful.

You mean there is a situation where you'd actually recommend/use

> max(it.imap(operator.setitem, it.repeat(d), keys, vals))

? I'd like to see that use case.

On second thought -- we might both settle on "Recommended by nobody" ;)




More information about the Python-list mailing list