Какой самый эффективный способ получить доступ к значению родного словаря в Python dict? - PullRequest
3 голосов
/ 16 января 2009

В Python у меня есть список словарей, который выглядит следующим образом:

matchings = [
    {'id': 'someid1', 'domain': 'somedomain1.com'},
    {'id': 'someid2', 'domain': 'somedomain2.com'},
    {'id': 'someid3', 'domain': 'somedomain3.com'}
]

и у меня есть переменная:

the_id = 'someid3'

Какой самый эффективный способ получить значение предмета в домене?

Ответы [ 5 ]

6 голосов
/ 16 января 2009

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

domains = [matching['domain'] for matching in matchings if matching['id'] == the_id]

Что соответствует формату стандартного формата:

resulting_list = [item_to_return for item in items if condition]

И в основном включает в себя все следующие функции:

domains = []
for matching in matchings:
    if matching['id'] == the_id:
        domains.append(matching['domain'])

Вся эта функциональность представлена ​​в одной строке с использованием списочных представлений.

2 голосов
/ 16 января 2009

Я бы реструктурировал matchings.

from collections import defaultdict
matchings_ix= defaultdict(list)
for m in matchings:
    matchings_ix[m['id']].append( m )

Теперь самый эффективный поиск -

matchings_ix[ d ]
1 голос
/ 16 января 2009

Лучшее, что я могу понять, это сделать явный поиск. Это одна из областей, где я разочарован в Python, так как он не дает вам сильный набор отделенных строительных блоков, как в алгоритмах C ++ STL

[d["domain"] for d in matchings if d["id"] == "someid3"]
0 голосов
/ 31 марта 2011

Мне действительно нравится использовать фильтр в такой ситуации. Он принимает функцию и итерацию и возвращает список элементов, где функция возвращает True (в Python 3.x он возвращает итератор).

>>> filter(lambda x: x['id'] == 'someid3', matchings)
<<< [{'domain': 'somedomain3.com', 'id': 'someid3'}]

Вы можете получить список всех доменов, используя понимание списка:

>>> [x['domain'] for x in filter(lambda x: x['id'] == 'someid3', matchings)]
<<< ['somedomain3.com']
0 голосов
/ 16 января 2009

Тот факт, что в списке есть словари, на самом деле не имеет значения - проблема сводится к поиску элемента в списке, где какое-либо свойство имеет значение true. С этой целью, некоторые варианты ответа @ Soviut - это путь: понимание цикла или списка, изучение каждого из элементов до тех пор, пока не будет найдено совпадение. Нет никакого упорядоченного порядка элементов, так что вы даже не можете полагаться на что-то столь же полезное, как bisect .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...