Posts: 4,605
Threads: 1,482
Joined: Sep 2016
Jan-24-2017, 06:55 AM
(This post was last modified: Jan-24-2017, 06:58 AM by Skaperen.)
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>
Tradition is peer pressure from dead people
What do you call someone who speaks three languages? Trilingual. Two languages? Bilingual. One language? American.
Posts: 591
Threads: 26
Joined: Sep 2016
Jan-24-2017, 07:14 AM
(This post was last modified: Jan-24-2017, 07:14 AM by Mekire.)
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
Posts: 2,955
Threads: 48
Joined: Sep 2016
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']
Posts: 591
Threads: 26
Joined: Sep 2016
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.
Posts: 2,955
Threads: 48
Joined: Sep 2016
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
Posts: 2,955
Threads: 48
Joined: Sep 2016
Jan-30-2017, 06:27 AM
(This post was last modified: Jan-30-2017, 06:28 AM by wavic.)
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]
Posts: 4,605
Threads: 1,482
Joined: Sep 2016
i wanted to do this in a comprehension.
but maybe i should not push comprehensions so much, considering this.
Tradition is peer pressure from dead people
What do you call someone who speaks three languages? Trilingual. Two languages? Bilingual. One language? American.
Posts: 2,955
Threads: 48
Joined: Sep 2016
Jan-31-2017, 07:24 AM
(This post was last modified: Jan-31-2017, 08:04 AM by wavic.)
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]
Posts: 2,343
Threads: 62
Joined: Sep 2016
Please don't use comprehensions for their side effects D=
Posts: 4,605
Threads: 1,482
Joined: Sep 2016
what side-effects of comprehensions do you see being used here? is making duplicate items a side-effect?
Tradition is peer pressure from dead people
What do you call someone who speaks three languages? Trilingual. Two languages? Bilingual. One language? American.
|