Specific iterator in one line

Chris Rebert clp2 at rebertia.com
Tue Jun 30 04:58:07 EDT 2009


2009/6/30 Filip Gruszczyński <gruszczy at gmail.com>:
> This is purely sport question. I don't really intend to use the answer
> in my code, but I am wondering, if such a feat could be done.
>
> I have a following problem: I have a list based upon which I would
> like to construct a different one. I could simply use list
> comprehensions, but there is an additional trick: for some elements on
> this list, I would like to return two objects. For example I have a
> list of 0s and 1s and for 0 I would like to add 1 'a' and for 1 I
> would like to add 2 'b', like this:
>
> [1, 0, 0, 1] -> ['b', 'b', 'a', 'a', 'b', 'b']
>
> The easy way is to return a tuple ('b', 'b') for 1s and then flatten
> them. But this doesn't seem very right - I'd prefer to create a nice
> iterable right away. Is it possible to achieve this? Curiosly, the
> other way round is pretty simple to achieve, because you can filter
> objects using if in list comprehension.

>>> reduce(lambda x,y:x+y,({1:['b']*2,0:['a']}[z] for z in [1, 0, 0, 1]))
['b', 'b', 'a', 'a', 'b', 'b']

69 chars long (plus or minus how the input list is written).
Where's my golf trophy? ;)

Cheers,
Chris
-- 
Goes to burn this shameful code...
http://blog.rebertia.com



More information about the Python-list mailing list