Вы можете использовать выражение генератора и next
функции, как этот
next(entry['id'] for entry in stop_list if entry['name'] == name)
Это будет перебирать stop_list
и когда он находит совпадение, это даст entry['id']
. Это будет лучше, потому что для этого не нужно перебирать весь список.
Еще одним преимуществом является, если имеется более одного совпадения, то вы можете использовать такое же выражение, чтобы получить следующий идентификатор также, как этот
>>> ids = next(entry['id'] for entry in stop_list if entry['name'] == name)
>>> next(ids)
# you will get the first matching id here
>>> next(ids)
# you will get the second matching id here
Если будет больше один поиск, а данные имена является уникальным, то предобработки списка и создать словарь, как этого
lookup = {entry['name']: entry['id'] for entry in stop_list}
, то вы можете сделать поиски в постоянная время, с lookup[name]
. Это было бы наиболее эффективным способом, если имена уникальны и если существует более одного поиска
Почему бы не создать сопоставление '{stop_name: stop_id, ...}' (если имена уникальны) или '{stop_name: [stop_id, ...], ...}' (если нет) ? Вы строите его, как только поиски по имени «O (1)». – jonrsharpe