2012-03-22 11 views
11

Có cách nào thông minh để viết danh sách hiểu hơn nhiều danh sách không?Giá trị Python của nhiều danh sách trong một danh sách hiểu

Tôi biết tôi có thể sử dụng danh sách phạm vi riêng làm chỉ mục nhưng theo cách này tôi phải biết chiều dài (hoặc nhận riêng biệt với cuộc gọi hàm len()).

>>> a = range(10) 
>>> b = range(10, 0, -1) 
>>> [(a[x],b[x]) for x in range(10)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

Tôi rất muốn có một cái gì đó như thế này:

>>> [(a,b) for a in range(10) and b in range(10, 0, -1)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

Làm thế nào bạn sẽ viết danh sách hiểu? Có cách nào để làm điều này với itertools?

Danh sách phạm vi chỉ phù hợp với bất kỳ danh sách nào và tôi không nhất thiết muốn nhận một bộ dữ liệu. cũng có thể là một hàm lấy a và b làm tham số. Vì vậy, zip không phải là những gì tôi muốn.

CẬP NHẬT: Với "Vì vậy, zip không phải là những gì tôi muốn." Tôi có nghĩa là tôi không muốn zip(range(10), range(10, 0, -1))

+0

Bản sao của [9184497] (http://stackoverflow.com/questions/9184497/python-list-comprehension-function-with- arguments-in-two-lists)? – quazgar

Trả lời

20

dụ của bạn chỉ là:

zip(range(10), range(10, 0, -1)) 

Tổng quát hơn, bạn có thể tham gia bất kỳ bộ iterables sử dụng zip:

[func(a, d, ...) for a, b, ..., n in zip(iterable1, iterable2, ..., iterableN)] 
+1

Giải pháp thứ hai là những gì tôi muốn. Cảm ơn rất nhiều. – dominik

+0

Bạn có thể muốn xem xét ['itertools.izip'] (http://docs.python.org/library/itertools.html#itertools.izip) vì nó tốt hơn ở các chuỗi lớn. Cùng một ý tưởng, chỉ là một công cụ hơi khác. –

+0

Tôi nghĩ rằng bạn có thể đã có nghĩa là để viết '[func (a, b, ...) cho a, b, ..., n trong zip (iterable1, iterable2, ..., iterableN)]' –

1

Nếu bạn muốn áp dụng một chức năng cho một số chuỗi, bạn cần hoặc là map hoặc itertools.imap:

map(lambda *x: sum(x), range(10), range(10, 0, -1), range(0,20, 2)) 

Không cần phải nén trừ khi bạn muốn lập bản đồ của mình trong danh sách hiểu

+0

những gì anh ta muốn. Nhìn vào ví dụ thứ hai của mình - anh ta muốn 'zip'. Và bạn không bao giờ cần 'bản đồ', một biểu thức danh sách/phát triển danh sách có thể làm mọi thứ có thể và hơn thế nữa. – agf

+1

@agf "cũng có thể là một hàm lấy a và b làm tham số. Vì vậy, zip không phải là thứ tôi muốn." Bạn có thể tranh luận rằng người ta cũng không bao giờ cần zip, bởi vì bản đồ có sẵn. – Marcin

+0

Ông đã viết rằng trước khi tôi thêm ví dụ thứ hai của tôi, cho thấy cách sử dụng một hàm với 'zip'. Đọc nhận xét của anh ấy về câu trả lời của tôi được viết sau khi tôi thêm nó. Anh ta có nghĩa là anh ta không muốn _just_ 'zip', không phải là anh ta không muốn' zip' cả. – agf