Поиск ключа в словаре, не зная его полного имени - PullRequest
1 голос
/ 31 октября 2011

У меня есть словарь с ключом ev ####, где #### - это число, которое я не знаю заранее. В словаре есть только один ключ этого типа, и никакой другой ключ не начинается с ev.

Какой самый простой способ получить доступ к этому ключу, не зная, что такое ####?

Ответы [ 3 ]

4 голосов
/ 31 октября 2011

Вы можете попробовать это понимание списка: ( ideone )

result = [v for k, v in d.iteritems() if k.startswith('ev')][0]

Или этот подход с использованием выражения генератора: ( ideone )

result = next(v for k, v in d.iteritems() if k.startswith('ev'))

Обратите внимание, что для обеих этих задач потребуется линейное сканирование элементов в словаре, в отличие от обычного поиска по ключу, который в среднем выполняется за постоянное время (при условии хорошей хэш-функции). Однако выражение генератора может остановиться, как только оно найдет ключ. Понимание списка всегда сканирует весь диктитон.

0 голосов
/ 31 октября 2011

Если в словаре есть только одно такое значение, я бы сказал, что лучше использовать подход, подобный следующему:

for k,v in d.iteritems():
    if k.startswith('ev'):
        result = v
        break
else:
    raise KeyError()  # or set to default value

Таким образом, вам не нужно перебирать все значения всловарь, но только до тех пор, пока вы не найдете ключ, который должен ускорить вычисления в среднем в ~ 2 раза.

0 голосов
/ 31 октября 2011

Сохраните элемент в словаре без префикса ev.

Если вам также нужен доступ к префиксу, сохраните его в обоих направлениях.

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

Если вы не можете легко сделать это при первоначальном создании словаря (например, чей-то код дает вам подсказку, а вы не можете его изменить), и вы будете делать много поисков такого рода, вероятно, стоит один раз выполнить итерацию по dict и сделать второй, или использовать dict для кэширования поисков, или что-то в этом роде, чтобы избежать повторения ключей каждый раз.

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