2010-10-10 19 views
19

Wenn ich mehrere identische Elemente zur Liste hinzuzufügen, muss ich list.extend verwenden:list.extend und Liste Verständnis

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

Ergebnis

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

Aber, wie mit der Liste der ähnlich zu tun Verständnis?

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

Ergebnis

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

Aber ich brauche diese eine

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

Irgendwelche Ideen?

Antwort

23

Gestapelte LCs.

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

Dank! Es funktioniert, aber ich verstehe nicht einmal, wie ich diesen Ausdruck lesen soll. – Stas

+0

'für x in a' extrahiert jedes der Elemente von' a' einzeln in 'x'. 'for y in ...' erstellt eine neue Liste aus 'x' und extrahiert ihre Elemente nacheinander in' y'. Es geschieht alles gleichzeitig (mehr oder weniger), wodurch alles auf derselben Verschachtelungsebene ist. –

+9

Es ist in der Regel klarer mit dem Auspacken: [y für (Artikel, Zeiten) in einem für y in [Artikel] * mal] – 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, ...)' ist O (n^2). – kennytm

3

Ein itertools Ansatz:

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

Wenn Sie es vorziehen Listenkomprehensionen erstrecken sich über:

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