Проверка двух чисел в списке без двойного просмотра списка в кратчайшем удобочитаемом виде - PullRequest
0 голосов
/ 24 сентября 2018

Итак, я хочу проверить, есть ли в списке целые числа a или b.

Не просматривая список дважды, я могу сделать это:

def hasab(nums):
  for i in nums:
    if(i == a or i == b):
      return True
  return False

Однако ямне было интересно, можно ли это сократить до одной-двух строк, но только смог найти способ, который повторял бы список дважды:

def hasab(nums):
  return a in nums or b in nums

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

1 Ответ

0 голосов
/ 24 сентября 2018

главная проблема здесь в том, что вам, кажется, требуется, чтобы nums было list, где - поскольку целые числа являются хэшируемыми -, nums может быть / start как set.В этом случае:

def hasab(nums):
  return a in nums or b in nums

будет самым быстрым способом проверить это, и в этом случае in не "повторяется" в set.Значения хешируются и проверяются со средним временем O(1).Это плюс короткое замыкание делает это очень быстрым.

Конечно, nums не следует преобразовывать из list в set каждый раз, иначе это будет бесполезно.

Длябольше элементов (или неизвестное количество элементов), вы можете рассмотреть возможность использования any:

return any(x in nums for x in [a,b,c,d,...])

Если ваши данные также поступают в set, то лучший способ - проверить, являются ли оба набора't disjoint:

return not nums.isdisjoint(input_set)

isdisjoint действительно эффективен, только если внутренний аргумент равен set (для более подробной информации: задайте разницу производительности issubset в зависимости от типа аргумента )

Так что просто убедитесь, что вы создаете / поддерживаете nums как set, а не list, и в вашем распоряжении будут быстрые и удобочитаемые конструкции.

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