2010-10-13 13 views
12

ich diese Liste Verständnis haben:Repeating Elemente in Liste Verständnis

[[x,x] for x in range(3)] 

, die in dieser Liste ergibt:

[[0, 0], [1, 1], [2, 2]] 

aber was ich will ist diese Liste:

[0, 0, 1, 1, 2, 2] 

Was ist der einfachste Weg, um diese Liste zu generieren?

Antwort

10
[y for x in range(3) for y in [x, x]] 
+3

Wenn man es generatlize will könnte man schreiben '[x] * 2' statt' [x, x] '. – phimuemue

+0

@phimuemue: was wäre noch langsamer – SilentGhost

2
>>> [int(x/2) for x in range(6)] 
[0, 0, 1, 1, 2, 2] 
+0

Vielleicht wäre die Verwendung des Integer Divisionsoperators mit 'x // 2' besser als' int (x/2) '? In Python 2.7 zeigt 'timeit' an, dass' // 'etwas mehr als doppelt so schnell ist, in Python 3.1 fast dreimal, für große Bereiche. – gotgenes

0

Sie könnten damit durchkommen:

[floor(x/2) for x in range(6)] 

edit1

[int(x/2) for x in range(6)] 

ist die mehr tragbare Lösung in der gleichen Richtung. Obwohl die anderen präsentierten Antworten besser erscheinen.

+0

'math.floor()' gibt ein 'float' zurück, also ist das nicht ganz dasselbe. –

+0

gibt Integer in py3k zurück, obwohl – SilentGhost

4
>>> [i for i in range(3) for _ in range(2)] 
[0, 0, 1, 1, 2, 2] 
4

eine allgemeine Lösung;

m = 3 #the list of integers 
n = 2 # of repetitions 
[x for x in range(m) for y in range(n)] 
0
[x/2 for x in range(6)] 

Update:

[x//2 for x in range(6)] #ok now ? 
+0

nur für Python 2.x ... – Ant

+0

yeap das Recht :) – mouad

+0

@Ant: Wechsel zu py3k Syntax ist trivial. Aber die gleiche Lösung wurde von Ned – SilentGhost

1

Meine Lösung:

def explode_list(p,n): 
    arr=[] 
    track=0 

    if n==0: 
     return arr  
    while track<len(p): 
     m=1 
     while m<=n: 
      arr.append(p[track]) 
      m=m+1 
     track=track+1 

    return arr