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 -- http://mail.python.org/mailman/listinfo/python-list