Python Forum
duplication in list comprehension
Thread Rating:
  • 1 Vote(s) - 3 Average
  • 1
  • 2
  • 3
  • 4
  • 5
duplication in list comprehension
#1
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.
Reply
#2
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
Reply
#3
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']
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#4
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.
Reply
#5
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
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#6
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]
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#7
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.
Reply
#8
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]
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#9
Please don't use comprehensions for their side effects D=
Reply
#10
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.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  List Comprehension Issue johnywhy 5 440 Jan-14-2024, 07:58 AM
Last Post: Pedroski55
Question mypy unable to analyse types of tuple elements in a list comprehension tomciodev 1 427 Oct-17-2023, 09:46 AM
Last Post: tomciodev
  Using list comprehension with 'yield' in function tester_V 5 1,175 Apr-02-2023, 06:31 PM
Last Post: tester_V
  list comprehension 3lnyn0 4 1,360 Jul-12-2022, 09:49 AM
Last Post: DeaD_EyE
  List comprehension used differently coder_sw99 3 1,679 Oct-03-2021, 04:12 PM
Last Post: coder_sw99
  How to invoke a function with return statement in list comprehension? maiya 4 2,750 Jul-17-2021, 04:30 PM
Last Post: maiya
  List comprehension and Lambda cametan 2 2,196 Jun-08-2021, 08:29 AM
Last Post: cametan
  What is the difference between a generator and a list comprehension? Pedroski55 2 2,176 Jan-02-2021, 04:24 AM
Last Post: Pedroski55
  For Loop with List Comprehension muzikman 25 6,408 Dec-18-2020, 10:45 PM
Last Post: muzikman
  Using recursion instead of for loops / list comprehension Drone4four 4 3,072 Oct-10-2020, 05:53 AM
Last Post: ndc85430

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020