2010-10-10 12 views
19

Quando ho bisogno di aggiungere diversi articoli identici alla lista che uso lista.extend lista:lista.extend e comprensione

a = ['a', 'b', 'c'] 
a.extend(['d']*3) 

Risultato

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

Ma, come fare il simile con lista comprensione?

a = [['a',2], ['b',2], ['c',1]] 
[[x[0]]*x[1] for x in a] 

Risultato

[['a', 'a'], ['b', 'b'], ['c']] 

Ma ho bisogno di questo

['a', 'a', 'b', 'b', 'c'] 

Tutte le idee?

risposta

23

LC sovrapposte.

[y for x in a for y in [x[0]] * x[1]] 
+5

Grazie! Funziona ma non capisco nemmeno come leggere questa espressione. – Stas

+0

'per x in a' estrae ciascuno degli elementi di' a' uno alla volta in 'x'. 'per y in ...' crea una nuova lista da 'x' ed estrae i suoi elementi uno alla volta in' y'. Succede tutto nello stesso momento (più o meno), facendo sì che tutto sia allo stesso livello di nidificazione. –

+9

Di solito è più chiaro con la decompressione: [y per (articolo, volte) in a per y in [elemento] * volte] – tokland

4
>>> a = [['a',2], ['b',2], ['c',1]] 
>>> [i for i, n in a for k in range(n)] 
['a', 'a', 'b', 'b', 'c'] 
1
import operator 
a = [['a',2], ['b',2], ['c',1]] 
nums = [[x[0]]*x[1] for x in a] 
nums = reduce(operator.add, nums) 
+2

'reduce (operator.add, ...)' è O (n^2). – kennytm

3

Un itertools approccio:

import itertools 

def flatten(it): 
    return itertools.chain.from_iterable(it) 

pairs = [['a',2], ['b',2], ['c',1]] 
flatten(itertools.repeat(item, times) for (item, times) in pairs) 
# ['a', 'a', 'b', 'b', 'c'] 
1
>>> a = [['a',2], ['b',2], ['c',1]] 
>>> sum([[item]*count for item,count in a],[]) 
['a', 'a', 'b', 'b', 'c'] 
2

Se si preferisce estendersi list comprehension:

a = [] 
for x, y in l: 
    a.extend([x]*y) 
Problemi correlati