Bagaimana saya bisa melakukan hal berikut dengan Python?
row = [unicode(x.strip()) for x in row if x is not None else '']
Pada dasarnya:
- ganti semua Nones dengan string kosong, lalu
- menjalankan suatu fungsi.
python
list-comprehension
AP257
sumber
sumber
Jawaban:
Anda benar-benar dapat melakukannya. Ini hanya masalah pemesanan:
Secara umum,
Dan, untuk pemahaman daftar
if
hanya dengan ketentuan,Perhatikan bahwa ini sebenarnya menggunakan konstruksi bahasa yang berbeda, ekspresi kondisional , yang dengan sendirinya bukan bagian dari sintaksis pemahaman , sedangkan bagian
if
setelahnyafor…in
adalah bagian dari daftar pemahaman dan digunakan untuk menyaring elemen dari sumber yang dapat diubah.Ekspresi bersyarat dapat digunakan dalam semua jenis situasi di mana Anda ingin memilih antara dua nilai ekspresi berdasarkan kondisi tertentu. Ini melakukan hal yang sama dengan operator ternary
?:
yang ada dalam bahasa lain . Sebagai contoh:sumber
l = [ 2, 3, 4, 5]
kemudian[x if x % 2 == 0 for x in l]
memberi saya kesalahan sementara[x if x % 2 == 0 else 200 for x in l]
berfungsi. Ya saya tahu untuk memfilternya saya harus menulis[ x for x in l if x % 2 == 0]
. Maaf mengganggu. Terima kasih atas jawaban anda.Satu arah:
Meskipun begitu Anda memiliki:
Atau Anda dapat menggunakan inline lambda.
sumber
if
ekspresi atau kode dielse
blok pernyataannya. Jawaban yang diterima lebih baik untuk kasus-kasus sederhana.Berikut adalah contoh ilustrasi lain:
Ini mengeksploitasi fakta yang
if i
mengevaluasiFalse
untuk0
danTrue
untuk semua nilai lain yang dihasilkan oleh fungsirange()
. Oleh karena itu pemahaman daftar mengevaluasi sebagai berikut:sumber
Masalah khusus telah dipecahkan dalam jawaban sebelumnya, jadi saya akan membahas gagasan umum menggunakan persyaratan dalam pemahaman daftar.
Berikut adalah contoh yang menunjukkan bagaimana kondisional dapat ditulis dalam pemahaman daftar:
Perhatikan bahwa dalam pemahaman daftar pertama
X_non_str
, urutannya adalah:dan dalam pemahaman daftar terakhir
X_str_changed
, urutannya adalah:Saya selalu merasa sulit untuk mengingat bahwa ekspresi1 harus sebelum jika dan ekspresi2 harus setelah yang lain . Kepalaku ingin keduanya sebelum atau sesudah.
Saya kira itu dirancang seperti itu karena menyerupai bahasa normal, misalnya "Saya ingin tinggal di dalam jika hujan, kalau tidak saya ingin pergi ke luar"
Dalam bahasa Inggris biasa , dua jenis pemahaman daftar yang disebutkan di atas dapat dinyatakan sebagai:
Dengan hanya
if
:dan dengan
if/else
sumber
Solusi lain sangat bagus untuk satu
if
/else
konstruksi. Namun, pernyataan ternary dalam pemahaman daftar bisa dibilang sulit dibaca.Menggunakan fungsi membantu keterbacaan, tetapi solusi seperti itu sulit untuk diperluas atau diadaptasi dalam alur kerja di mana pemetaan adalah input. Kamus dapat mengatasi masalah ini:
sumber
Ini berkaitan dengan bagaimana pemahaman daftar dilakukan.
Ingatlah yang berikut:
Setara dengan:
Di mana
expression
ada dalam format yang sedikit berbeda (berpikir beralih subjek dan urutan kata kerja dalam kalimat).Karenanya, kode Anda
[x+1 for x in l if x >= 45]
melakukan ini:Namun, kode ini
[x+1 if x >= 45 else x+5 for x in l]
melakukan ini (setelah mengatur ulangexpression
):sumber
Tidak ada kebutuhan untuk ternary jika / lalu / selain itu. Menurut pendapat saya, pertanyaan Anda memerlukan jawaban ini:
sumber
Tampaknya lebih baik untuk menggeneralisasi semua formulir yang mungkin daripada memberikan jawaban spesifik untuk pertanyaan. Kalau tidak, pembaca tidak akan tahu bagaimana jawabannya ditentukan. Berikut adalah beberapa bentuk umum yang saya pikirkan sebelum saya sakit kepala mencoba untuk memutuskan apakah klausul final lain dapat digunakan dalam bentuk terakhir.
Nilai
item
tidak perlu digunakan dalam salah satu klausa bersyarat. Aconditional3
dapat digunakan sebagai saklar untuk menambah atau tidak menambahkan nilai ke daftar output.Misalnya, untuk membuat daftar baru yang menghilangkan string kosong atau string spasi putih dari daftar string asli:
sumber
this if condition else that
atau ekspresi normal diizinkan. Tidakvalue = this if condition
(yang bisa diraih denganvalue = this if condition else None
)Anda dapat menggabungkan logika kondisional dalam pemahaman:
sumber
(venv) $ python list_comp.py Affichage
de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]
Jadi, untuk Anda:
row = [('', unicode(x.strip()))[x is not None] for x in row]
sumber