Saya suka menggunakan ekspresi
if 'MICHAEL89' in USERNAMES:
...
dimana USERNAMES
daftarnya.
Apakah ada cara untuk mencocokkan item dengan ketidakpekaan kasing atau apakah saya perlu menggunakan metode khusus? Hanya ingin tahu apakah ada kebutuhan untuk menulis kode tambahan untuk ini.
python
string
list
case-insensitive
RadiantHex
sumber
sumber
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
membuat seluruh daftar.(name.upper() for name in USERNAMES)
hanya akan membuat generator dan satu string yang diperlukan sekaligus - penghematan memori yang besar jika Anda sering melakukan operasi ini. (bahkan lebih banyak penghematan, jika Anda cukup membuat daftar nama pengguna huruf kecil yang Anda gunakan kembali untuk mengeceknya setiap waktu)Saya akan membuat pembungkus sehingga Anda bisa menjadi non-invasif. Minimal, misalnya ...:
Sekarang,
if CaseInsensitively('MICHAEL89') in whatever:
harus berperilaku seperti yang diminta (apakah sisi kanan adalah daftar, dikt, atau ditetapkan). (Mungkin perlu lebih banyak upaya untuk mencapai hasil serupa untuk penyertaan string, menghindari peringatan dalam beberapa kasus yang melibatkanunicode
, dll).sumber
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
melakukannya, yang mungkin tidak termasuk "berperilaku seperti yang diminta".etc.
dan "memerlukan lebih banyak usaha" dari jawaban saya ;-).Biasanya (setidaknya dalam oop) Anda membentuk objek Anda untuk berperilaku seperti yang Anda inginkan.
name in USERNAMES
tidak peka huruf besar kecil, jadiUSERNAMES
perlu diubah:Hal yang hebat tentang ini adalah ia membuka jalan untuk banyak perbaikan, tanpa harus mengubah kode apa pun di luar kelas. Misalnya, Anda bisa mengubah
self.names
ke satu set untuk pencarian yang lebih cepat, atau(n.lower() for n in self.names)
hanya menghitung sekali dan menyimpannya di kelas dan seterusnya ...sumber
str.casefold
direkomendasikan untuk pencocokan string yang case-insensitive. @ solusi nmichaels dapat dengan mudah diadaptasi.Gunakan salah satu dari:
Atau:
Sesuai dokumen :
sumber
Ini salah satu caranya:
Agar ini berfungsi, keduanya
string1
danstring2
objek harus bertipestring
.sumber
Saya pikir Anda harus menulis beberapa kode tambahan. Sebagai contoh:
Dalam hal ini kami membuat daftar baru dengan semua entri masuk
USERNAMES
dikonversi menjadi huruf besar dan kemudian membandingkannya dengan daftar baru ini.Memperbarui
Seperti yang dikatakan @viraptor , bahkan lebih baik menggunakan generator
map
. Lihat @Nathon 's jawaban .sumber
itertools
fungsiimap
. Ini jauh lebih cepat daripada generator tetapi mencapai tujuan yang sama.Anda bisa melakukannya
Pembaruan: bermain-main sedikit dan saya pikir Anda bisa mendapatkan pendekatan tipe arus pendek yang lebih baik
The
ifilter
fungsi dari itertools, salah satu modul favorit saya dalam Python. Ini lebih cepat daripada generator tetapi hanya membuat item berikutnya dari daftar ketika dipanggil.sumber
5 sen saya (salah)
MEMPERBARUI
Aduh, setuju sepenuhnya @jpp, saya akan tetap sebagai contoh praktik buruk :(
sumber
'a' in "".join(['AB']).lower()
pengembalianTrue
ketika ini bukan yang diinginkan OP.Saya membutuhkan ini untuk kamus alih-alih daftar, solusi Jochen adalah yang paling elegan untuk kasus itu jadi saya modded sedikit:
sekarang Anda dapat mengonversi kamus seperti itu
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
dan menggunakannyaif 'MICHAEL89' in USERNAMESDICT:
sumber
Untuk memilikinya dalam satu baris, inilah yang saya lakukan:
Saya tidak mengujinya secara waktu. Saya tidak yakin seberapa cepat / efisien itu.
sumber