2013-11-12 2 views
0

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

example_dict = {"foo": 1, "bar": 2} 

И я хочу сделать несколько подстановочных семантически эквивалентно:

foo = example_dict["foo"] 
bar = example_dict["bar"] 

Есть ли способ делать несколько поисков одновременно? Ближайший у меня использует список понимание или выражение генератора, как:

foo, bar = [example_dict[key] for key in ["foo", "bar"]] 
foo, bar = (example_dict[key] for key in ["foo", "bar"]) 

В идеале я хотел бы сделать что-то вроде:

foo, bar = example_dict.getmany(["foo", "bar"]) 

Или даже:

foo, bar = example_dict["foo", "bar"] 

аналогичным образом к тому, что вы могли бы сделать со списком или кортежем:

foo, bar = "foo", "bar" 

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

+3

Неа. Для этого нет встроенной операции. –

+0

Похоже, вам нужно что-то более сильное, чем словарь (возможно, база данных)? – yuvi

+1

@yuvi уверен, что в некоторых ситуациях, когда усилия по кодированию оправданы, но встроенная функция языка была бы хорошим местом для усилий -выходная кривая. Я надеялся, что там был темный угол питона, который мне не хватало. –

ответ

3

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

In [112]: example_dict = {"foo": 1, "bar": 2} 
In [113]: map(example_dict.__getitem__, ['foo', 'bar']) 
[0x1, 
0x2] 

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

0

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

Короткий ответ заключается в том, что нет возможности сделать это с использованием словарей Python. Более длинный ответ заключается в том, что если существуют шаблоны поиска, которые являются общими, вы можете использовать их для ограничения количества поисковых запросов. Например, если вы всегда смотрите «foo», а затем «bar», вы можете вместо этого использовать составной ключ - возможно, кортеж («foo», «bar») - и сохранить значения в кортеже.

Код для хранения значений будет выглядеть

d["foo", "bar"] = (42, 47) 

Код для извлечения значения будет так

foo_value, bar_value = d["foo", "bar"] 
+0

Я не согласен с тем, что это преждевременная оптимизация (хотя, как и я, я бы: P).Если была языковая функция, которую было легче написать, чем альтернатива * и *, выполняемая лучше, это определенно не преждевременная оптимизация. В одном из моих других комментариев я упомянул кривую усилий и вознаграждения, здесь также применяется концепция. –

Смежные вопросы