Cách tạo khung cho hai vòng lặp trong python hiểu danh sách


101

Tôi có hai danh sách như dưới đây

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 các mục từ entrieskhi chúng ở trong tags:

result = []

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

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


3
Sử dụng itertools.chainnếu bạn muốn có một danh sách phẳng:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Ashwini Chaudhary

Câu trả lời:


135

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

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

157

Cách tốt nhất để nhớ điều này là thứ tự của vòng lặp for bên trong khả năng hiểu danh sách dựa trên 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 hầu hết xuất hiện đầu tiên, và sau đó là các vòng lặp bên trong sau đó.

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

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

Nói chung, if-elsecâu lệnh xuất hiện trước vòng lặp for đầu tiên và nếu bạn chỉ có một ifcâu lệnh, nó sẽ xuất hiện ở cuối. Ví dụ: nếu bạn muốn thêm một danh sách trống, nếu tagkhông có mục nhập, bạn sẽ làm như thế này:

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

6

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 lặp trong LC tương tự như thứ tự trong các vòng lặp lồng nhau, các câu lệnh if đi đến cuối và các biểu thức điều kiện đi ở đầu, giống 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']]

CHỈNH SỬA - Vì bạn cần làm phẳng kết quả, bạn có thể sử dụng cách hiểu danh sách tương tự và sau đó làm phẳng 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 điều 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 biểu thức trình tạo ở đây thay vì hiểu danh sách. (Hoàn toàn khớp với giới hạn 79 ký tự (không có lệnh listgọi))


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

result = []
[result.extend(entry) for tag in tags for entry in entries if tag in entry]

print(result)

Đầu ra:

['man', 'thats', 'right', 'awesome']

0

Nói một cách dễ hiểu, việc lặp lại danh sách lồng nhau phải tuân theo cùng một thứ tự so với các vòng lặp tương đương được ghép sẵn cho.

Để hiểu rõ, chúng ta sẽ lấy một ví dụ đơn giản từ NLP. Bạn muốn tạo một danh sách tất cả các từ từ một danh sách các câu trong đó mỗi câu là một danh sách các từ.

>>> list_of_sentences = [['The','cat','chases', 'the', 'mouse','.'],['The','dog','barks','.']]
>>> all_words = [word for sentence in list_of_sentences for word in sentence]
>>> all_words
['The', 'cat', 'chases', 'the', 'mouse', '.', 'The', 'dog', 'barks', '.']

Để xóa các từ lặp lại, bạn có thể sử dụng tập hợp {} thay vì danh sách []

>>> all_unique_words = list({word for sentence in list_of_sentences for word in sentence}]
>>> all_unique_words
['.', 'dog', 'the', 'chase', 'barks', 'mouse', 'The', 'cat']

hoặc áp dụng list(set(all_words))

>>> all_unique_words = list(set(all_words))
['.', 'dog', 'the', 'chases', 'barks', 'mouse', 'The', 'cat']

0
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]

6
Xin chào và chào mừng bạn đến với Stack Overflow! Vui lòng đăng một lời giải thích và không chỉ mã.
Evelyn

1
Xin chào! Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do tại sao điều này giải quyết vấn đề sẽ thực sự giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều phiếu bầu hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định áp dụng.
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.