Saya punya daftar objek. Saya ingin menemukan satu (pertama atau apa pun) objek dalam daftar ini yang memiliki atribut (atau hasil metode - apa pun) sama dengan value
.
Apa cara terbaik untuk menemukannya?
Inilah test case:
class Test:
def __init__(self, value):
self.value = value
import random
value = 5
test_list = [Test(random.randint(0,100)) for x in range(1000)]
# that I would do in Pascal, I don't believe isn't anywhere near 'Pythonic'
for x in test_list:
if x.value == value:
print "i found it!"
break
Saya pikir menggunakan generator dan reduce()
tidak akan membuat perbedaan karena masih akan mengulangi daftar.
ps .: Persamaan dengan value
hanyalah sebuah contoh. Tentu saja kami ingin mendapatkan elemen yang memenuhi syarat apa pun.
Jawaban:
Ini mendapatkan item pertama dari daftar yang sesuai dengan kondisi, dan kembali
None
jika tidak ada item yang cocok. Ini bentuk ekspresi tunggal pilihan saya.Namun,
Versi loop-break naif, sangat Pythonic - singkat, jelas, dan efisien. Untuk membuatnya cocok dengan perilaku one-liner:
Ini akan menetapkan
None
untukx
jika Anda tidakbreak
keluar dari loop.sumber
... if getattr(x, x.fieldMemberName) == value
. Itu akan mengambil atribut darix
dengan nama yang tersimpanfieldMemberName
, dan membandingkannya denganvalue
.else
Klausa dimaksudkan untuk berada difor
loop, bukanif
. (Edit yang Ditolak).Karena belum disebutkan hanya untuk penyelesaian. Filter ol yang baik untuk memfilter elemen yang akan disaring.
Ftw pemrograman fungsional.
Saya tahu bahwa umumnya dalam daftar python, pemahaman lebih disukai atau setidaknya itulah yang saya baca, tapi saya tidak melihat masalah ini jujur. Tentu saja Python bukan bahasa FP, tetapi Map / Reduce / Filter dapat dibaca dengan sempurna dan merupakan kasus penggunaan standar paling standar dalam pemrograman fungsional.
Jadi begitulah. Ketahuilah pemrograman fungsional Anda.
daftar kondisi filter
Ini tidak akan menjadi lebih mudah dari ini:
sumber
filter
mengembalikan daftar yang tidak kompatibel dengannyanext
. 2 : itu mensyaratkan bahwa ada kecocokan yang pasti, kalau tidak Anda akan mendapatkanStopIteration
pengecualian.Contoh sederhana : Kami memiliki array berikut
Sekarang, kami ingin menemukan objek dalam array yang memiliki id sama dengan 1
next
dengan pemahaman daftarKeluarkan semua metode di atas
{'id': 1, 'name': 'ronaldo'}
sumber
Saya baru saja mengalami masalah yang sama dan menemukan optimasi kecil untuk kasus di mana tidak ada objek dalam daftar memenuhi persyaratan. (Untuk kasus penggunaan saya ini menghasilkan peningkatan kinerja besar):
Seiring dengan daftar test_list, saya menyimpan set test_value_set tambahan yang terdiri dari nilai-nilai daftar yang saya perlu filter. Jadi di sini bagian lain dari solusi AGF menjadi sangat cepat.
sumber
Anda bisa melakukan sesuatu seperti ini
Itulah yang saya gunakan untuk menemukan objek dalam array objek yang panjang.
sumber
Anda juga bisa menerapkan perbandingan kaya melalui
__eq__
metode untukTest
kelas Anda dan menggunakanin
operator. Tidak yakin apakah ini cara terbaik yang berdiri sendiri, tetapi jika Anda perlu membandingkanTest
contoh berdasarkanvalue
tempat lain, ini bisa berguna.sumber
Untuk kode di bawah ini, xGen adalah ekspresi generator anonom, yFilt adalah objek filter. Perhatikan bahwa untuk xGen, parameter None tambahan dikembalikan daripada membuang StopIteration saat daftar habis.
Keluaran:
sumber