Python Forum

Full Version: duplication in list comprehension
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
if i have

x=['a','b','c','d','e','f']

how can i make duplicates in a list comprehension and get a result like:

['a','a','b','b','c','c','d','d','e','e','f','f']

i tried this and (as expected) it did not work:
Output:
lt1/forums /home/forums 40> py3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> x=['a','b','c','d','e','f'] >>> x ['a', 'b', 'c', 'd', 'e', 'f'] >>> [z z for z in x]   File "<stdin>", line 1     [z z for z in x]        ^ SyntaxError: invalid syntax >>> [z, z for z in x]   File "<stdin>", line 1     [z, z for z in x]             ^ SyntaxError: invalid syntax >>> lt1/forums /home/forums 41>
Well, like this I guess:
x = ['a','b','c','d','e','f']

doubles = [item for pair in zip(x,x) for item in pair]

print(doubles)
But do you really think that is clearer than this:
doubles = []
for item in x:
    doubles.extend([item]*2)

print(doubles)
Matter of taste I guess.  Honestly not sure which I prefer.

Also, this I guess:
import itertools


x = ['a','b','c','d','e','f']
doubles = list(itertools.chain(*zip(x, x)))
print(doubles)
Basically it is a list flattening problem.
Lots of stuff here:
http://stackoverflow.com/questions/95291...-in-python
In [11]: x = ['a','b','c','d','e','f']

In [12]: x = x*2

In [13]: x
Out[13]: ['a', 'b', 'c', 'd', 'e', 'f', 'a', 'b', 'c', 'd', 'e', 'f']

In [14]: x.sort()

In [15]: x
Out[15]: ['a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'e', 'e', 'f', 'f']
That is definitely a way to do it, though if you have a sequence in which relative order matters but sorting would give a different order it might not be what you want.

For example:
>>> a = [5, 6, 2, 9, 13 ,2]
>>> sorted(a*2)
[2, 2, 2, 2, 5, 5, 6, 6, 9, 9, 13, 13]
>>>
Definitely something to consider though.
Yes, I am aware but that was not the case. Enyway, if there isn't a sequence in the list, this approach is not going to work
This should work in any case. Also, the list can be doubled, tripled, etcetera. The order doesn't matter.
In [1]: from itertools import repeat, tee

In [2]: l = list(range(10))

In [3]: l
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [4]: it = tee(l, 2)

In [5]: doubled = []

In [6]: for i, j in repeat(range(2), len(l)):
   ...:     doubled.extend([next(it[i]), next(it[j])])
   ...:     

In [7]: doubled
Out[7]: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
i wanted to do this in a comprehension.

but maybe i should not push comprehensions so much, considering this.
Well,

In [3]: [doubled.extend(list(i)) for i in zip(l, l)]
Out[3]: [None, None, None, None, None, None, None, None, None, None]

In [4]: doubled
Out[4]: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
works but returns None after any iteration. It's basically the same as in the previous post.

I am not good with list comprehensions. Yet...
Here is a new one.

In [88]: [x for i in zip(l, l) if doubled.extend(list(i)) != None]
Out[88]: []

In [89]: doubled
Out[89]: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
Please don't use comprehensions for their side effects D=
what side-effects of comprehensions do you see being used here? is making duplicate items a side-effect?
Pages: 1 2