Specific iterator in one line

Andreas Tawn andreas.tawn at ubisoft.com
Tue Jun 30 05:42:48 EDT 2009


> > 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.
> >
> If you'll allow me a prior "import itertools",
> 
> >>> [i for e in [1,0,0,1] for i in itertools.repeat('ab'[e], e+1)]
> 
> does the job in 62 characters.

list("".join([("a","b"*2)[x] for x in [1,0,0,1]])

50 characters. Do I win £5?


More information about the Python-list mailing list