2010-10-10 36 views
19

Khi tôi cần thêm một số mặt hàng giống hệt nhau vào danh sách tôi sử dụng list.extend:list.extend và danh sách hiểu

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

quả

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

Nhưng, làm thế nào để thực hiện tương tự với danh sách bao quát?

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

quả

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

Nhưng tôi cần điều này một

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

Bất kỳ ý tưởng?

Trả lời

23

LC xếp chồng.

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

Cảm ơn! Nó hoạt động nhưng tôi thậm chí không hiểu cách đọc biểu thức này. – Stas

+0

'cho x trong a' trích xuất từng phần tử của' a' từng phần vào 'x'. 'for y in ...' tạo một danh sách mới từ 'x' và trích xuất từng phần tử của nó thành' y'. Tất cả đều xảy ra cùng một lúc (nhiều hay ít hơn), khiến cho tất cả đều ở cùng mức độ làm tổ. –

+9

Nó thường là rõ ràng hơn với giải nén: [y cho (mục, thời gian) trong một cho y trong [item] * lần] – 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, ...)' là O (n^2). – kennytm

3

Một itertools cách tiếp cận:

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

Nếu bạn thích mở rộng hơn comprehensions danh sách:

a = [] 
for x, y in l: 
    a.extend([x]*y) 
Các vấn đề liên quan