2010-10-10 14 views

cevap

23

Yığınlanmış LC'ler.

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

Teşekkür! Çalışıyor ama bu ifadeyi nasıl okuyacağımı bile bilmiyorum. – Stas

+0

'x 'de' a 'öğelerinin her birini bir defada x' içine ayıklar. 'y için ...' 'x''den yeni bir liste oluşturur ve elemanlarını her seferinde bir kere çıkarır. Hepsi aynı anda (daha fazla veya daha az) olur ve hepsinin aynı yuvalanma seviyesinde olmasına neden olur. –

+9

Paket açma ile genellikle daha nettir: [öğe] * katındaki y için (öğe, zamanlar için) y – 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

'azaltma (operator.add, ...)' O (n^2) 'dir. – kennytm

3

bir itertools yaklaşım:

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

liste comprehensions üzerinde uzatmak isterseniz:

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