Я хочу сделать что-то вроде:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
Как проверить, находятся ли оба слова 'foo' и 'bar' в dict foo?
python
dictionary
Жан-Франсуа Корбетт
источник
источник
set
лучше. Как обычно ... измерить! -)Если вы все еще на Python 2, вы можете сделать
Если вы все еще на самом старом Python <= 2.6, вы можете вызвать
set
dict, но он будет перебирать весь dict для создания набора, и это медленно:источник
set(("foo","bar")) <= myDict.keys()
что избегает временного набора, поэтому гораздо быстрее. Для моего тестирования это примерно та же скорость, что и при использовании всего, когда запрос был 10 элементов. Это становится медленнее, когда запрос становится больше, хотя.if {'foo', 'bar'} <= set(myDict): ...
Простая тестовая установка для 3 альтернатив.
Введите свои собственные значения для D и Q
источник
d.viewkeys()
сделатьset(q) <= d.viewkeys()
.Python 2.7.5
естьd.keys()
метод тоже.set(q) <= ...
TypeError: can only compare to a set
. Сожалею! :))d.viewkeys() >= set(q)
. Я пришел сюда, чтобы выяснить, почему порядок имеет значение!Вам не нужно оборачивать левую сторону в наборе. Вы можете просто сделать это:
Это также работает лучше, чем
all(k in d...)
решение.источник
Используя наборы :
В качестве альтернативы:
источник
set(d)
такой же, какset(d.keys())
(без промежуточного списка, которыйd.keys()
Как насчет этого:
источник
all
.Я думаю, что это самый умный и содержательный.
источник
Хотя мне нравится ответ Алекса Мартелли, он не кажется мне пифоническим. То есть я думал, что важная часть того, чтобы быть Pythonic, должна быть легко понятной. С этой целью
<=
не легко понять.Хотя это больше символов, использование,
issubset()
как предложено ответом Карла Фойгтланда, более понятно. Поскольку этот метод может использовать словарь в качестве аргумента, короткое, понятное решение:Я хотел бы использовать
{'foo', 'bar'}
вместоset(('foo', 'bar'))
, потому что это короче. Тем не менее, это не так понятно, и я думаю, что скобки слишком легко спутать как словарь.источник
.issubset()
. Я думаю, что в документации по Python по умолчанию это Pythonic.Решение Алекса Мартелли
set(queries) <= set(my_dict)
- самый короткий код, но, возможно, не самый быстрый. Предположим, Q = len (запросы) и D = len (my_dict).Требуется O (Q) + O (D), чтобы сделать два набора, а затем (можно надеяться!) Только O (min (Q, D)), чтобы выполнить тест подмножества - при условии, конечно, что поиск набора Python O (1) - это наихудший случай (когда ответ True).
Генераторное решение hughdbrown (et al?)
all(k in my_dict for k in queries)
Является наихудшим вариантом O (Q).Осложняющие факторы:
(1) все циклы в основанном на множестве гаджете все выполняются на C-скорости, тогда как любое основанное на гаджете зацикливается на байт-коде.
(2) Вызывающий объект любого гаджета на основе может иметь возможность использовать любое знание вероятности сбоя, чтобы упорядочить элементы запроса соответствующим образом, тогда как гаджет на основе набора не допускает такого контроля.
Как всегда, если важна скорость, рекомендуется провести сравнительный анализ в условиях эксплуатации.
источник
Вы можете использовать .issubset () , а также
источник
Как насчет использования лямбда?
источник
Если вы хотите:
затем:
источник
Не хочу предполагать, что это не то, о чем вы не подумали, но я считаю, что самая простая вещь, как правило, самая лучшая:
источник
Джейсон, () не нужны в Python.
источник
На мой взгляд, есть два метода, которые легко понять из всех приведенных вариантов. Так что мои главные критерии - это очень читаемый код, а не исключительно быстрый код. Чтобы код был понятен, я предпочитаю использовать следующие возможности:
Тот факт, что "var <= var2.keys ()" выполняется быстрее в моем тестировании ниже, я предпочитаю этот.
источник
В случае определения соответствия только некоторых ключей это работает:
Еще один вариант найти, если совпадают только некоторые ключи:
источник
Еще одна опция для определения, все ли ключи находятся в dict:
источник
Это похоже на работу
источник
()
что сначала будет оцениваться результатTrue
, а затем проверяться, еслиTrue in ok
. Как это на самом деле работает ?!