Daftar pemahaman dengan pernyataan if

106

Saya ingin membandingkan 2 iterable dan mencetak item yang muncul di kedua iterable.

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

Tapi itu memberi saya kesalahan sintaks yang tidak valid di mana ^telah ditempatkan. Apa yang salah dengan fungsi lamba ini?

OrangeTux
sumber
5
semua jawaban di bawah ini benar, tetapi juga b = ('q')tidak membuat tupel. Tupel dengan satu elemen membutuhkan eksplisit ,, yaitub = ('q',)
dmg
Saya telah berubah tuplesmenjadi iterables.
OrangeTux

Jawaban:

187

Anda salah memesan. The ifharus setelah for(kecuali dalam if-elseoperator ternary)

[y for y in a if y not in b]

Namun ini akan berhasil:

[y if y not in b else other_value for y in a]
Keriangan
sumber
Terima kasih. Saya melihat posting ini stackoverflow.com/questions/4406389/… tentang pernyataan if else dalam fungsi lambda. Dan saya pikir hanya menggunakan pernyataan if (tanpa yang lain) akan bekerja dalam urutan yang sama.
OrangeTux
39

Anda meletakkan ifdi akhir:

[y for y in a if y not in b]

Pemahaman daftar ditulis dalam urutan yang sama seperti rekan-rekan mereka yang ditentukan penuh bersarang, pada dasarnya pernyataan di atas diterjemahkan menjadi:

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

Versi Anda mencoba melakukan ini sebagai gantinya:

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

tetapi pemahaman daftar harus dimulai dengan setidaknya satu putaran luar.

Martijn Pieters
sumber
Anda sudah sangat membantu. Terima kasih.
Tolgahan ÜZÜN
7

daftar rumus pemahaman:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

jadi Anda bisa melakukannya seperti ini:

[y for y in a if y not in b]

Hanya untuk tujuan demonstrasi: [y if y not in b else False for y in a]

Vishvajit Pathak
sumber
2
Anda tidak dapat memasukkan elsepemahaman ke dalam daftar, tidak di tempat yang paling tidak Anda masukkan. Jangan bingung antara pemahaman daftar (pemfilteran), dengan ekspresi kondisional (yang harus memiliki nilai, membuat ekspresi else wajib).
Martijn Pieters
Setuju. elsedigunakan dalam pemahaman daftar meskipun seperti yang ditunjukkan dalam kode.
Vishvajit Pathak
2
Itu a ekspresi bersyarat . Ini dapat digunakan di mana pun ekspresi yang valid berlaku. Ini tidak spesifik untuk pemahaman daftar.
Martijn Pieters
5

Ini bukan fungsi lambda. Ini adalah pemahaman daftar.

Ubah saja urutannya:

[ y for y in a if y not in b]
eumiro
sumber
-2

Saya meneliti dan mencoba saran pemahaman daftar yang disebutkan di atas untuk situasi saya seperti yang dijelaskan di bawah ini tetapi tidak berhasil. Apa yang saya lakukan salah di sini?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

Itu tidak menyaring kata-kata.

Deepak Dhiman
sumber
1
Yang perlu Anda lakukan adalah mengajukan pertanyaan. Tidak memposting jawaban.
Whirl Mind
Sebenarnya, Ini mengatakan untuk memposting pertanyaan setelah jeda 1 hari dari 2 hari terakhir untuk saya. Pada dasarnya saya tidak diizinkan untuk mengirim pertanyaan karena pertanyaan saya sebelumnya yang tidak sesuai standar stackoverflow. Maaf atas ketidaknyamanan ini.
Deepak Dhiman