Какой самый простой способ поиска по списку диктов в Python? - PullRequest
1 голос
/ 13 октября 2010

Моя база данных в настоящее время возвращает список диктов:

id_list = ({'id': '0c871320cf5111df87da000c29196d3d'}, 
           {'id': '2eeeb9f4cf5111df87da000c29196d3d'}, 
           {'id': '3b982384cf5111df87da000c29196d3d'}, 
           {'id': '3f6f3fcecf5111df87da000c29196d3d'}, 
           {'id': '44762370cf5111df87da000c29196d3d'}, 
           {'id': '4ba0d294cf5111df87da000c29196d3d'})

Как я могу легко проверить, есть ли данный идентификатор в этом списке или нет?

Спасибо.

Ответы [ 5 ]

7 голосов
/ 13 октября 2010

Как я могу легко проверить, есть ли данный идентификатор в этом списке или нет?

Сделать набор

keys = set( d['id'] for d in id_list )
if some_value in keys

Не спрашивайте, если это«эффективный» или «лучший».Он включает в себя стандартный компромисс.

Построение набора требует времени.Но тогда поиск происходит мгновенно.

  • Если вы выполняете много поисков, стоимость построения набора амортизируется по каждому поиску.

  • Если вы делаете несколько поисков, стоимость сборки набора может быть выше, чем что-либо или * {'id':some_value} in id_list.

7 голосов
/ 13 октября 2010

Вот одна строка:

if some_id in [d.get('id') for d in id_list]:
    pass

Не очень эффективно, хотя.

edit - Лучшим подходом может быть:

if some_id in (d.get('id') for d in id_list):
    pass

Таким образом, список заранее не генерируется во всю длину.

5 голосов
/ 13 октября 2010

если вы создаете словарь для вашего идентификатора поиска,

search_dic = {'id': '0c871320cf5111df87da000c29196d3d'}

id_list = ({'id': '0c871320cf5111df87da000c29196d3d'}, 
           {'id': '2eeeb9f4cf5111df87da000c29196d3d'}, 
           {'id': '3b982384cf5111df87da000c29196d3d'}, 
           {'id': '3f6f3fcecf5111df87da000c29196d3d'}, 
           {'id': '44762370cf5111df87da000c29196d3d'}, 
           {'id': '4ba0d294cf5111df87da000c29196d3d'})


if search_dic in id_list:
    print 'yes'
3 голосов
/ 13 октября 2010
any(x.get('id')==given_id for x in id_list)

.,,возвращает логическое значение.Эффективность?См. Ответ С. Лотта

2 голосов
/ 13 октября 2010

Вы можете сгладить его с помощью понимания списка и использовать в:

id in [d['id'] for d in id_list]

Вы также можете использовать выражения генератора, которые имеют различные характеристики производительности (и будут использовать меньше памяти, если ваш список огромен):

id in (d['id'] for d in id_list)
...