Python Forum
duplication in list comprehension - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: duplication in list comprehension (/thread-1749.html)

Pages: 1 2


duplication in list comprehension - Skaperen - Jan-24-2017

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>



RE: duplication in list comprehension - Mekire - Jan-24-2017

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/952914/making-a-flat-list-out-of-list-of-lists-in-python


RE: duplication in list comprehension - wavic - Jan-24-2017

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']



RE: duplication in list comprehension - Mekire - Jan-24-2017

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.


RE: duplication in list comprehension - wavic - Jan-24-2017

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


RE: duplication in list comprehension - wavic - Jan-30-2017

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]



RE: duplication in list comprehension - Skaperen - Jan-31-2017

i wanted to do this in a comprehension.

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


RE: duplication in list comprehension - wavic - Jan-31-2017

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]



RE: duplication in list comprehension - micseydel - Jan-31-2017

Please don't use comprehensions for their side effects D=


RE: duplication in list comprehension - Skaperen - Feb-02-2017

what side-effects of comprehensions do you see being used here? is making duplicate items a side-effect?