что такое синтаксис python для проверки двух списков (как использовать логическое выражение OR) - PullRequest
0 голосов
/ 23 января 2012

Я пытаюсь проверить словарь на предмет наличия предмета (и ключей, и значений): правильный синтаксис?

  if item in companies.keys() or companies.values()
       append item

или

 if item in (companies.keys() or companies.values())
       append item

или что-то еще

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Как насчет такой попытки?

if (item in companies.keys()) or (item in companies.values()):
    append item

Я думаю, что круглые скобки вокруг (x in y) являются необязательными, поскольку оператор or имеет меньший приоритет.

Редактировать:

Однако есть некоторые недостатки с использованием item in companies.keys(), особенно в версии Python до Python 3, где метод .keys() выполняет итерации по всем ключам и создает список всех ключей.

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

if (item in companies) or (item in companies.values()):
    append item

Или без скобок (хотя мне труднее читать):

if item in companies or item in companies.values():
    append item
0 голосов
/ 23 января 2012

Если вы выполните проверку большого списка предметов:

companies_values = set(companies.values())
# ...
for item in items:
    if item not in companies and item not in companies_values:
       # item is not among keys or values of companies
       # add item

Не использовать item in companies.keys().

dict.keys и dict.values создают новые списки (в Python 2.x) каждый раз, когда вы вызываете их. Это O(N) операция. Найти элемент в списке также можно с помощью операции O(N), где N - количество элементов в списке. O(N) примерно означает линейное время, чем больше N, тем больше времени требуется.

С другой стороны, item in some_dict - это амортизированная O(1) операция (в среднем постоянное время независимо от размера словаря). То же самое для item in some_set.

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