2015-06-05 4 views
0

У меня есть список (stop_list) словаря. структура словаряКак получить значение из списка словарей Python?

stop_id : "" 
stop_name : "" 

Теперь у меня есть имя строки, которая должна быть согласована с stop_name и получить stop_id соответствующие этому.

Есть ли эффективный способ сделать это? Я мог бы придумать только цикл.

for entry in stop_list: 
      if name = entry['name']: 
       id = entry['id'] 
       break 
+0

Почему бы не создать сопоставление '{stop_name: stop_id, ...}' (если имена уникальны) или '{stop_name: [stop_id, ...], ...}' (если нет) ? Вы строите его, как только поиски по имени «O (1)». – jonrsharpe

ответ

4

Вы можете использовать выражение генератора и 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]. Это было бы наиболее эффективным способом, если имена уникальны и если существует более одного поиска

+0

Уверен, что второго элемента не будет. Так, это будет работать правильно? Или другой лучший способ, учитывая, что второго элемента не будет. –

+0

@IshanBhatt Вы будете делать поиски более одного раза? – thefourtheye

+0

Нет, только один поиск. –

0

После просмотра кода кажется, что вы получаете словарь с тем же именем. Если ваше имя уникально, вы должны рассмотреть возможность использования dict для ваших dicts, где ключ будет именем.

1 - это позволит вам не просматривать список (он является дорогостоящим по сравнению с Dict поиска)

2 - это более читаемым

3 - вы вызываете запись [ «имя»] только один раз

Допустим, что ваш stopdict будет выглядеть, что

stopdict= { 
    'stop1' : {'name' : 'stop1', 'id' : 1} 
    'stop2' : {'name' : 'stop2', 'id' : 2} 
} 

доступа идентификатор будет выглядеть так:

stopdict[entry['name']]['id'] 
Смежные вопросы