2013-09-04 35 views
5

Hãy nói rằng chúng tôi có một danh sách mylist = ['a', 'b', 'c'], và chúng tôi muốn tạo ra một danh sách như thế này: ['a:1', 'a:2', 'b:1', 'b:2', 'c:1', 'c:2'], mà về cơ bản gắn ':1'':2' để mỗi phần tử của mylist.hằng Áp dụng trong danh sách hiểu

Tôi tự hỏi làm thế nào để làm điều này một cách hiệu quả bằng cách sử dụng danh sách hiểu, nếu có thể?

Trả lời

6

Như thế này:

['%s:%d' % (e, i) for e in mylist for i in (1, 2)] 
+1

-1 vì vòng lặp lồng nhau trong hiểu được khó hiểu, và có thể không quen thuộc với OP. – Marcin

2
In [4]: mylist = ['a', 'b', 'c'] 

In [5]: list(itertools.chain.from_iterable([[e+":1", e+":2"] for e in mylist])) 
Out[5]: ['a:1', 'a:2', 'b:1', 'b:2', 'c:1', 'c:2'] 
+0

Cách tiếp cận tốt đẹp - nó không xảy ra với tôi (hoặc dường như bất kỳ ai khác) để tính toán hiệu quả sản phẩm. – Marcin

5

Tôi nghĩ rằng cách hiệu quả nhất để làm điều này là với itertools.product:

http://docs.python.org/2/library/itertools.html#itertools.product

from itertools import product 

mylist = ['a', 'b', 'c'] 
mysuffixes = [':1', ':2'] 
result = [x+y for x, y in product(mylist, mysuffixes)] 

Việc xây dựng chính xác có thể thay đổi tùy theo cách hằng số của bạn được xác định.

+0

cảm ơn! Nhưng tôi tự hỏi làm thế nào hiệu quả là một trong những điều này so sánh với cách tiếp cận danh sách tinh khiết hiểu bởi mata ở trên? – MLister

+1

Một thử nghiệm đơn giản mà tôi đã thiết lập bằng cách sử dụng mô-đun 'timeit' hiển thị chúng giống nhau cho danh sách dài 10000 và danh sách hậu tố 2 chiều, thử nghiệm với 1000 lần lặp lại mỗi lần. Tôi đã nhìn thấy một trong hai phiên bản đánh bại khác khi chạy cái khác - trong phiên bản cực đoan nhất, phiên bản sản phẩm mất 3,11 giây cho 1000 lần lặp lại trong khi phiên bản danh sách hiểu 4.57. Mặt khác, tôi cũng thấy phiên bản danh sách hiểu 3.26s trong khi phiên bản sản phẩm mất 4.08s. Đây không phải là phân tích chính xác nghiêm ngặt nhưng có vẻ như bất kỳ sự khác biệt về tốc độ sẽ nhỏ. –

3

Khái niệm này cũng giống như itertools.product

>>> from itertools import product 
>>> list(product(mylist, ('1', '2'))) 
[('a', '1'), ('a', '2'), ('b', '1'), ('b', '2'), ('c', '1'), ('c', '2')] 

Như trả lại sản phẩm Tuples bạn phải tham gia mà bộ dữ liệu với : Tôi nghĩ rằng giải pháp này là rõ ràng nhất:

>>> map(':'.join, product(mylist, ('1', '2'))) 
['a:1', 'a:2', 'b:1', 'b:2', 'c:1', 'c:2'] 
4
>>> a=['a','b','c'] 
>>> b=[1,2] 
>>> import itertools 
>>> ['%s:%s' % (x,y) for x,y in itertools.product(a,b)] 
['a:1', 'a:2', 'b:1', 'b:2', 'c:1', 'c:2'] 
+0

Và bây giờ tôi nghĩ chúng ta có ba câu trả lời cho thấy tất cả ba cách rõ ràng để xây dựng các chuỗi cuối cùng từ các tuples 'itertools.product' sản lượng (chuỗi nối, nội suy chuỗi và' nối'). –

Các vấn đề liên quan