Saya memiliki daftar tupel dengan Python , dan saya memiliki persyaratan di mana saya ingin mengambil cabang HANYA jika tupel tidak ada dalam daftar (jika ada dalam daftar, maka saya tidak ingin mengambil cabang if)
if curr_x -1 > 0 and (curr_x-1 , curr_y) not in myList:
# Do Something
Ini tidak benar-benar bekerja untuk saya. Apa yang telah saya lakukan salah?
3 -1 > 0 and (4-1 , 5) not in []
⤇True
karena itu kesalahannya bukan merupakan prioritas operator.myList.count((curr_x, curr_y))
, jika(curr_x, curr_y)
tidak adamyList
, hasilnya akan0
Jawaban:
Bug itu mungkin ada di tempat lain dalam kode Anda, karena itu akan berfungsi dengan baik:
Atau dengan tupel:
sumber
if not ELEMENT in COLLECTION:
A not in B
direduksi menjadi melakukannot B.__contains__(A)
yang sama dengan apanot A in B
yang direduksi menjadi apanot B.__contains__(A)
.__notcontains__
. Maaf, lalu yang saya katakan hanyalah omong kosong.not
memiliki prioritas lebih tinggi daripadain
yang tidak. Pertimbangkan hasilast.dump(ast.parse("not A in B").body[0])
yang menghasilkan"Expr(value=UnaryOp(op=Not(), operand=Compare(left=Name(id='A', ctx=Load()), ops=[In()], comparators=[Name(id='B', ctx=Load())])))"
Jikanot
dikelompokkan erat ke A, orang akan mengharapkan hasil"Expr(value=Compare(left=UnaryOp(op=Not(), operand=Name(id='A', ctx=Load())), ops=[In()], comparators=[Name(id='B', ctx=Load())]))"
yang merupakan parse untuk"(not A) in B"
.Solusi termurah dan paling mudah dibaca adalah menggunakan
in
operator (atau dalam kasus khusus Anda,not in
). Seperti disebutkan dalam dokumentasi,Selain itu,
y not in x
secara logis sama dengannot y in x
.Berikut ini beberapa contoh:
Ini juga berfungsi dengan tupel, karena tupel dapat hashable (sebagai konsekuensi dari fakta bahwa tuple juga tidak berubah):
Jika objek pada RHS mendefinisikan suatu
__contains__()
metode,in
secara internal akan memanggilnya, seperti yang disebutkan dalam paragraf terakhir dari bagian Perbandingan dari dokumen.in
sirkuit pendek, jadi jika elemen Anda berada di awal daftar,in
evaluasi lebih cepat:Jika Anda ingin melakukan lebih dari sekadar memeriksa apakah suatu item ada dalam daftar, ada beberapa opsi:
list.index
dapat digunakan untuk mengambil indeks suatu item. Jika elemen itu tidak ada, aValueError
dinaikkan.list.count
dapat digunakan jika Anda ingin menghitung kejadian.Masalah XY: Sudahkah Anda mempertimbangkan
set
s?Tanyakan pada diri Anda pertanyaan-pertanyaan ini:
hash
mereka?Jika Anda menjawab "ya" untuk pertanyaan ini, Anda seharusnya menggunakan kata
set
ganti. Tesin
keanggotaan padalist
s adalah O (n) kompleksitas waktu. Ini berarti bahwa python harus melakukan pemindaian linear daftar Anda, mengunjungi setiap elemen dan membandingkannya dengan item pencarian. Jika Anda melakukan ini berulang kali, atau jika daftarnya besar, operasi ini akan menimbulkan biaya tambahan.set
objek, di sisi lain, hash nilainya untuk cek keanggotaan waktu konstan. Pemeriksaan juga dilakukan dengan menggunakanin
:Jika Anda cukup disayangkan bahwa elemen yang Anda cari / tidak cari ada di akhir daftar Anda, python akan memindai daftar hingga akhir. Ini terbukti dari timing di bawah ini:
Sebagai pengingat, ini adalah opsi yang cocok selama elemen yang Anda simpan dan cari dapat di-hashable. TKI, mereka harus berupa tipe yang tidak berubah, atau objek yang mengimplementasikan
__hash__
.sumber