2013-08-31 75 views
44

Tôi có hai danh sách như sauLàm thế nào để đóng khung hai cho vòng trong danh sách hiểu python

tags = [u'man', u'you', u'are', u'awesome'] 
entries = [[u'man', u'thats'],[ u'right',u'awesome']] 

tôi muốn trích xuất thông tin nhập từ entries khi họ đang có trong tags:

result = [] 

for tag in tags: 
    for entry in entries: 
     if tag in entry: 
      result.extend(entry) 

Làm thế nào tôi có thể viết hai vòng lặp như một danh sách dòng đơn?

+2

Sử dụng 'itertools.chain' nếu bạn muốn có một danh sách dẹt: 'danh sách (chuỗi .from_iterable (mục nhập cho thẻ trong các thẻ cho mục nhập trong các mục nhập nếu thẻ trong mục nhập)) ' –

Trả lời

57

này nên làm điều đó:

[entry for tag in tags for entry in entries if tag in entry] 
3

Các LC thích hợp sẽ là

[entry for tag in tags for entry in entries if tag in entry] 

Thứ tự của các vòng trong LC cũng tương tự như những người thân trong vòng lồng nhau, nếu báo cáo đi đến cùng và các biểu thức có điều kiện đi trong đầu, một cái gì đó như

[a if a else b for a in sequence] 

Xem Demo -

>>> tags = [u'man', u'you', u'are', u'awesome'] 
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']] 
>>> [entry for tag in tags for entry in entries if tag in entry] 
[[u'man', u'thats'], [u'right', u'awesome']] 
>>> result = [] 
    for tag in tags: 
     for entry in entries: 
      if tag in entry: 
       result.append(entry) 


>>> result 
[[u'man', u'thats'], [u'right', u'awesome']] 

EDIT - Vì, bạn cần kết quả để được làm phẳng, bạn có thể sử dụng một danh sách tương tự và sau đó làm phẳng các kết quả.

>>> result = [entry for tag in tags for entry in entries if tag in entry] 
>>> from itertools import chain 
>>> list(chain.from_iterable(result)) 
[u'man', u'thats', u'right', u'awesome'] 

Thêm này với nhau, bạn chỉ có thể làm

>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry)) 
[u'man', u'thats', u'right', u'awesome'] 

Bạn sử dụng một biểu thức máy phát điện ở đây thay vì một sự hiểu biết danh sách. (Hoàn toàn phù hợp với giới hạn 79 nhân vật quá (không có list cuộc gọi))

76

Cách tốt nhất để nhớ này là thứ tự của vòng lặp for bên trong danh sách hiểu được dựa theo thứ tự mà chúng xuất hiện trong cách tiếp cận vòng lặp truyền thống. Vòng lặp bên ngoài nhất đến trước, và sau đó các vòng bên trong sau đó.

Vì vậy, danh sách hiểu tương đương sẽ là:

[entry for tag in tags for entry in entries if tag in entry] 

Nói chung, if-else tuyên bố đứng trước đầu tiên cho vòng lặp, và nếu bạn có chỉ là một tuyên bố if, nó sẽ đến lúc kết thúc. Đối với ví dụ, nếu bạn muốn thêm một danh sách rỗng, nếu tag không có trong entry, bạn sẽ làm điều đó như thế này:

[entry if tag in entry else [] for tag in tags for entry in entries]