Untuk menjana senarai baharu dalam Python dengan mengekstrak atau memadamkan hanya elemen senarai (tatasusunan) sedia ada yang memenuhi syarat tertentu, atau dengan melakukan penggantian atau penukaran, gunakan pemahaman senarai.
Perkara berikut diterangkan di sini, bersama dengan kod sampel.
- Bentuk asas tatatanda pemahaman senarai
- Gunakan proses pada semua elemen senarai
- Ekstrak dan padam elemen daripada senarai yang memenuhi kriteria
- Gantikan atau tukar elemen yang memenuhi syarat senarai
Lihat artikel berikut untuk contoh khusus senarai rentetan.
- BERKAITAN:Mengekstrak dan menggantikan elemen yang memenuhi syarat senarai (tatasusunan) rentetan dalam Python
Ia juga mungkin untuk mengekstrak unsur-unsur yang tidak memenuhi kriteria secara rawak.
Ambil perhatian bahawa senarai boleh menyimpan jenis data yang berbeza dan berbeza daripada tatasusunan. Jika anda ingin mengendalikan tatasusunan dalam proses yang memerlukan saiz memori dan alamat memori atau pemprosesan berangka data besar, gunakan tatasusunan (pustaka standard) atau NumPy.
Senarai berikut adalah contoh
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Bentuk asas tatatanda pemahaman senarai
Apabila menjana senarai baharu daripada senarai, pemahaman senarai adalah lebih mudah untuk ditulis berbanding untuk gelung.
[expression for any variable name in iterable object if conditional expression]
Ungkapan digunakan pada elemen yang memenuhi ungkapan bersyarat objek boleh lelar (seperti senarai atau tuple) dan menjadi elemen senarai baharu. “Ungkapan jika bersyarat” boleh diabaikan, dalam hal ini ungkapan digunakan pada semua elemen.
Lihat artikel berikut untuk mendapatkan butiran lanjut, termasuk notasi pemahaman senarai bersarang.
Gunakan proses pada semua elemen senarai
Contohnya, jika anda ingin menggunakan beberapa pemprosesan pada semua elemen senarai, huraikan pemprosesan yang dikehendaki dalam ungkapan pemahaman senarai di atas.
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
Ini boleh digunakan untuk menukar antara senarai nombor dan senarai rentetan.
Ekstrak dan padam elemen daripada senarai yang memenuhi kriteria
Jika elemen hanya untuk dipilih dengan ungkapan bersyarat, ia tidak diproses oleh ungkapan, jadi ia mengambil bentuk berikut
[variable name for variable name in original list if conditional expression]
Senarai baharu dihasilkan dari mana hanya elemen yang memenuhi syarat (elemen yang ungkapan bersyaratnya adalah benar) diekstrak.
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
Jika “jika ungkapan bersyarat” ditetapkan kepada “jika bukan ungkapan bersyarat”, ia menjadi penolakan dan hanya elemen yang tidak memenuhi syarat (elemen yang ungkapan bersyaratnya palsu) boleh dipilih dan diekstrak. Dalam erti kata lain, senarai baharu dihasilkan dari mana unsur-unsur yang memenuhi syarat dikeluarkan.
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Sudah tentu, hasil yang sama diperoleh dengan menyatakan ungkapan bersyarat yang setara tanpa menggunakan tidak.
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Bahagian ungkapan bersyarat boleh berbilang syarat. Not negatif juga boleh digunakan.
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
Gantikan atau tukar elemen yang memenuhi syarat senarai
Dalam contoh pengekstrakan unsur di atas, unsur yang tidak memenuhi syarat telah dialih keluar.
Jika anda ingin melakukan penggantian, penukaran, dsb. hanya pada elemen yang memenuhi syarat, gunakan operator ternary pada bahagian ungkapan notasi pemahaman senarai.
Dalam Python, pengendali ternary boleh ditulis seperti berikut
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
Ia agak rumit, tetapi gabungan tatatanda pemahaman senarai dan pengendali ternary adalah seperti berikut.
[True Value if Conditional Expression else False Value for any variable name in original list]
Bahagian yang disertakan dalam kurungan ialah pengendali ternary (kurungan tidak diperlukan dalam kod sebenar).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Jika mana-mana nama pembolehubah ditulis sebagaimana adanya untuk nilai benar atau salah, nilai elemen asal digunakan sebagaimana adanya. Jika ungkapan ditulis, pemprosesan ungkapan itu digunakan.
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]