Specific iterator in one line

Peter Otten __peter__ at web.de
Tue Jun 30 12:34:44 CEST 2009


Peter Otten wrote:

> Andreas Tawn wrote:
> 
>>> > > 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?
>> 
>> list("".join([("a","bb")[x] for x in [1,0,0,1]])
>> 
>> Or 49 :o)
> 
>>>> len("""sum(([["a"],["b","b"]][i]for i in [1,0,0,1]),[])""")
> 48
>>>> sum(([["a"],["b","b"]][i]for i in [1,0,0,1]),[])
> ['b', 'b', 'a', 'a', 'b', 'b']

forgot one extra space:

>>> sum(([["a"],["b","b"]][i]for i in[1,0,0,1]),[])
['b', 'b', 'a', 'a', 'b', 'b']
>>> len("""sum(([["a"],["b","b"]][i]for i in[1,0,0,1]),[])""")
47





More information about the Python-list mailing list