Cara membingkai dua untuk loop dalam python pemahaman daftar

101

Saya punya dua daftar seperti di bawah ini

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

Saya ingin mengekstrak entri dari entriessaat mereka berada di tags:

result = []

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

Bagaimana saya bisa menulis dua loop sebagai pemahaman daftar baris tunggal?

Shiva Krishna Bavandla
sumber
3
Gunakan itertools.chainjika Anda menginginkan daftar yang datar:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Ashwini Chaudhary

Jawaban:

135

Ini harus melakukannya:

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

sumber
159

Cara terbaik untuk mengingat ini adalah bahwa urutan perulangan for di dalam pemahaman daftar didasarkan pada urutan kemunculannya dalam pendekatan perulangan tradisional. Loop paling luar muncul lebih dulu, dan kemudian loop dalam selanjutnya.

Jadi, pemahaman daftar yang setara adalah:

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

Secara umum, if-elsepernyataan muncul sebelum perulangan for yang pertama, dan jika Anda hanya memiliki sebuah ifpernyataan, itu akan muncul di bagian akhir. Misalnya, jika Anda ingin menambahkan daftar kosong, jika tagtidak ada di entri, Anda akan melakukannya seperti ini:

[entry if tag in entry else [] for tag in tags for entry in entries]
Rohit Jain
sumber
6

LC yang sesuai adalah

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

Urutan loop di LC mirip dengan yang di loop bersarang, pernyataan if pergi ke akhir dan ekspresi kondisional pergi di awal, sesuatu seperti

[a if a else b for a in sequence]

Lihat 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 - Karena, Anda ingin hasilnya diratakan, Anda bisa menggunakan pemahaman daftar yang serupa dan kemudian meratakan hasilnya.

>>> 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']

Menambahkan ini bersama-sama, Anda bisa melakukannya

>>> 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']

Anda menggunakan ekspresi generator di sini, bukan pemahaman daftar. (Sangat cocok dengan batas 79 karakter juga (tanpa listpanggilan))

Sukrit Kalra
sumber
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)

Keluaran:

['man', 'thats', 'right', 'awesome']
Raghav Gupta
sumber
1
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]
TARUN KUMAR Singh
sumber
6
Halo dan selamat datang di Stack Overflow! Silakan posting penjelasan dan bukan hanya kode.
Evelyn
1
Halo! Meskipun kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan dan memberikan indikasi batasan dan asumsi apa yang berlaku.
Brian
0

Dalam pemahaman, iterasi daftar bersarang harus mengikuti urutan yang sama dari imbricated yang setara untuk loop.

Untuk memahaminya, kami akan mengambil contoh sederhana dari NLP. Anda ingin membuat daftar semua kata dari daftar kalimat di mana setiap kalimat adalah daftar kata.

>>> 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', '.']

Untuk menghapus kata yang berulang, Anda bisa menggunakan set {} daripada daftar []

>>> 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']

atau terapkan list(set(all_words))

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