Mari kita asumsikan saya membuat kelas sederhana untuk bekerja mirip dengan struct C-style, untuk hanya menyimpan elemen data. Saya mencoba mencari cara untuk mencari daftar objek untuk objek dengan atribut yang sama dengan nilai tertentu. Di bawah ini adalah contoh sederhana untuk mengilustrasikan apa yang saya coba lakukan.
Contohnya:
class Data:
pass
myList = []
for i in range(20):
data = Data()
data.n = i
data.n_squared = i * i
myList.append(data)
Bagaimana cara mencari daftar myList untuk menentukan apakah itu berisi elemen dengan n == 5?
Saya telah Googling dan mencari dokumen Python, dan saya pikir saya mungkin bisa melakukan ini dengan pemahaman daftar, tapi saya tidak yakin. Saya mungkin menambahkan bahwa saya harus menggunakan Python 2.4.3, jadi fitur gee-whiz 2.6 atau 3.x baru tidak tersedia untuk saya.
Jawaban:
Anda bisa mendapatkan daftar semua elemen yang cocok dengan pemahaman daftar:
[x for x in myList if x.n == 30] # list of all elements with .n==30
Jika Anda hanya ingin menentukan apakah daftar berisi elemen apa pun yang cocok dan melakukannya (secara relatif) secara efisien, Anda dapat melakukannya
def contains(list, filter): for x in list: if filter(x): return True return False if contains(myList, lambda x: x.n == 3) # True if any element has .n==3 # do stuff
sumber
Sederhana, Elegan, dan Kuat:
Ekspresi generator dalam hubungannya dengan builtin… (python 2.5+)
any(x for x in mylist if x.n == 10)
Menggunakan Python
any()
bawaan, yang didefinisikan sebagai berikut:def any(iterable): for element in iterable: if element: return True return False
sumber
any(x for x in mylist if x['n'] == 10)
tapi ide yang bagusHanya untuk kelengkapan, jangan lupakan Hal Paling Sederhana yang Mungkin Bisa Berhasil:
for i in list: if i.n == 5: # do something with it print "YAY! Found one!"
sumber
[x for x in myList if x.n == 30] # list of all matches [x.n_squared for x in myList if x.n == 30] # property of matches any(x.n == 30 for x in myList) # if there is any matches [i for i,x in enumerate(myList) if x.n == 30] # indices of all matches def first(iterable, default=None): for item in iterable: return item return default first(x for x in myList if x.n == 30) # the first match, if any
sumber
filter(lambda x: x.n == 5, myList)
sumber
lambda
s.Anda dapat menggunakan
in
untuk mencari item dalam koleksi, dan pemahaman daftar untuk mengekstrak bidang yang Anda minati. Ini (berfungsi untuk daftar, set, tupel, dan apa pun yang mendefinisikan__contains__
atau__getitem__
).if 5 in [data.n for data in myList]: print "Found it"
Lihat juga:
sumber
Anda harus menambahkan a
__eq__
dan__hash__
metode keData
kelas Anda , itu bisa memeriksa apakah__dict__
atributnya sama (properti yang sama) dan kemudian apakah nilainya sama juga.Jika Anda melakukan itu, Anda dapat menggunakan
test = Data() test.n = 5 found = test in myList
Kata
in
kunci memeriksa apakahtest
masukmyList
.Jika Anda hanya ingin
n
properti diData
Anda dapat menggunakan:class Data(object): __slots__ = ['n'] def __init__(self, n): self.n = n def __eq__(self, other): if not isinstance(other, Data): return False if self.n != other.n: return False return True def __hash__(self): return self.n myList = [ Data(1), Data(2), Data(3) ] Data(2) in myList #==> True Data(5) in myList #==> False
sumber
Pertimbangkan untuk menggunakan kamus:
myDict = {} for i in range(20): myDict[i] = i * i print(5 in myDict)
sumber
Cara lain yang bisa Anda lakukan adalah menggunakan fungsi next ().
matched_obj = next(x for x in list if x.n == 10)
sumber