Mam listę dicts, coś takiego:W Pythonie znaleźć pozycję w liście dicts korzystając Przepoławiana
test_data = [
{ 'offset':0, 'data':1500 },
{ 'offset':1270, 'data':120 },
{ 'offset':2117, 'data':30 },
{ 'offset':4055, 'data':30000 },
]
Pozycje dict są klasyfikowane w wykazie zgodnie z danymi 'offset'
. Prawdziwe dane mogą być znacznie dłuższe.
Co chcę zrobić, to wyszukać pozycję na liście, podając konkretną wartość przesunięcia, która jest , a nie dokładnie jedną z tych wartości, ale w tym zakresie. Zatem binarne wyszukiwanie jest tym, co chcę zrobić.
Jestem już świadomy modułu Python bisect
, który jest gotowym wyszukiwaniem binarnym - świetnym, ale nie do bezpośredniego wykorzystania w tym przypadku. Zastanawiam się, jaki jest najłatwiejszy sposób dostosowania się do moich potrzeb. Oto co wymyśliłem:
import bisect
class dict_list_index_get_member(object):
def __init__(self, dict_list, member):
self.dict_list = dict_list
self.member = member
def __getitem__(self, index):
return self.dict_list[index][self.member]
def __len__(self):
return self.dict_list.__len__()
test_data_index_get_offset = dict_list_index_get_member(test_data, 'offset')
print bisect.bisect(test_data_index_get_offset, 1900)
Drukuje:
2
Moje pytanie brzmi, czy jest to najlepszy sposób, żeby zrobić to, co chcę, czy istnieje jakiś inny prostszy, lepszy sposób?