2015-07-31 17 views
6

Questa domanda sarà senza dubbio un pezzo di torta per un esperto di Python 2.7 (o appassionato), quindi eccolo qui.Creare un elenco di numeri interi con valori duplicati in Python

Come posso creare un elenco di numeri interi il cui valore è duplicato accanto al suo valore originale come questo?

a = list([0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) 

E 'davvero facile da fare in questo modo:

for i in range(10): a.append(int(i/2)) 

ma preferirei averlo in una semplice linea di partenza a = output desiderato.

Grazie per aver trovato il tempo di rispondere.

PS. nessuno dei "Domande che possono già avere la risposta erano quello che cercavo

risposta

11
>>> [i//2 for i in xrange(10)] 
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 

Un semplice approccio generico:.

>>> f = lambda rep, src: reduce(lambda l, e: l+rep*[e], src, []) 
>>> f(2, xrange(5)) 
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 
>>> f(3, ['a', 'b']) 
['a', 'a', 'a', 'b', 'b', 'b'] 
+1

stava per aggiungere che sarebbe '[int (i/2) per i in range (10)]' in Python 3, ma la domanda è per 2.7, quindi aggiungendo come commento. – Vlad

+2

Non è possibile che sia 2.7 sia 3.0 usino semplicemente 'i // 2'? –

+0

Abbastanza onesto, non ci avevo pensato. – Vlad

1
sorted(range(10) + range(10)) 
2
>>> sorted(2*range(5)) 
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 
0
[int(i/2)for i in range(10)] 

o

[i//2 for i in range(10)] 
1
>>> sorted(map(str, range(0,5) + range(0,5))) 
['0', '0', '1', '1', '2', '2', '3', '3', '4', '4'] 
2

Ecco una tecnica che funziona su qualsiasi lista, non solo int liste, e non si basa sulla (relativamente) costoso funzione sorted(). Consente inoltre di specificare il numero di ripetizioni.

In primo luogo, una versione semplice per risolvere il problema nel PO:

print [u for v in [[i,i] for i in range(5)] for u in v] 

uscita

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 

E ora la fantasia (ma un po 'più leggibile) versione.

a = list('abcde') 
rep = 3 
print [item for sublist in [rep * [i] for i in a] for item in sublist] 

uscita

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

Ecco una versione estesa dell'esempio precedente, scritto utilizzando semplici for loop piuttosto che come una lista di comprensione nidificato.

b = [] 
for sublist in [rep * [i] for i in a]: 
    for item in sublist: 
     b.append(item) 
print b 
0

Le altre risposte coprire il caso specifico ha chiesto nella domanda, ma se si desidera duplicare il contenuto di un elenco arbitrario, è possibile utilizzare il seguente:

>>> import itertools 
>>> l = [1, 'a', 3] 
>>> list(itertools.chain.from_iterable(zip(l,l))) 
[1, 1, 'a', 'a', 3, 3] 
Problemi correlati