WedX - журнал о программировании и компьютерных науках

Как all() в python работает с пустыми списками

Я имею в виду следующий код Python

all(a==2 for a in my_list)

Я ожидаю, что приведенный выше код вернет True, если все элементы в my_list равны 2. но когда я делаю my_list пустым и запускаю его как

my_list = []
all(a==2 for a in my_list) 

он также возвращает True. Меня смущает такое поведение. Разве он не должен возвращать False, поскольку в my_list нет элемента со значением 2?



Ответы:


1

Это правда, потому что для каждого элемента в списке все 0 равны 2.

Вы можете думать о реализации all как:

def all(list, condition):
  for a in list:
    if not condition(a):
      return false
  return true

Принимая во внимание, что any:

def any(list, condition):
  for a in list:
    if condition(a):
      return true
  return false

То есть all невиновен, пока его вина не доказана, а any виновен, пока не доказана его невиновность.

26.10.2013
  • Аналогия понравилась! Спасибо за это :) 26.01.2018

  • 2

    «Все», примененное к пустому списку, является «пусто истинным», в чем легко убедиться:

    >>> all([])
    True
    

    Точно так же верно «если 0 = 1, то луна квадратная». В более общем смысле, «все P являются Q» — если нет никаких P, то утверждение считается истинным, поскольку его можно формально сформулировать как «Для всех x, если x является P, то x является Q». В конечном счете, они верны, потому что условный логический оператор (if-then) оценивается как True всякий раз, когда антецедент (первое предложение) имеет значение False: «если False, то True» оценивается как True. Напомним, что «если А, то В» эквивалентно «(не А) или В».

    26.10.2013

    3

    Рассмотрим рекурсивное определение all:

    def all(L):
        if L:
            return L[0] and all(L[1:])
        else:
            ???
    

    Если каждый элемент в L истинен, то должно быть истинным, что первый элемент в L истинен, и что all(L[1:]) истинен. Это легко увидеть для списка с несколькими элементами, но как насчет списка с одним элементом. Ясно, что каждый элемент верен, если истинен только один элемент, но как в этом случае работает наша рекурсивная формулировка? Определение all([]) как истинного заставляет алгоритм работать.

    Другой способ взглянуть на это так: для любого списка L, для которого all(L) неверно верно, мы должны иметь возможность идентифицировать по крайней мере один элемент, a, который неверен. Однако такого a в L нет, когда L пусто, поэтому мы вправе сказать, что all([]) истинно.

    Те же аргументы работают для any. Если any(L) истинно, мы должны быть в состоянии идентифицировать по крайней мере один элемент в L, который является истинным. Но так как мы не можем для пустого списка L, мы можем сказать, что any([]) ложно. Рекурсивная реализация any подтверждает это:

    def any(L):
        if L:
            return L[0] or any(L[1:])
        else:
            return False
    

    Если L[0] истинно, мы можем вернуть true, даже не выполняя рекурсивный вызов, поэтому предположим, что L[0] ложно. Единственный способ достичь базового случая — это если ни один элемент L не является истинным, поэтому мы должны вернуть False, если мы его достигнем.

    26.10.2013

    4

    Из офисных документов.

    all(iterable)
    Возвращает True, если все элементы итерируемого объекта истинны (или если итерируемый объект пуст). Эквивалентно:

    def all(iterable):
        for element in iterable:
            if not element:
                return False
        return True
    

    Новое в версии 2.5.

    any(iterable)
    Возвращает True, если какой-либо элемент итерируемого объекта имеет значение true. Если итерируемый объект пуст, верните False. Эквивалентно:

    def any(iterable):
        for element in iterable:
            if element:
                return True
        return False
    

    Новое в версии 2.5.

    25.03.2020

    5

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

    my_list and all(a==2 for a in my_list)
    
    20.07.2021
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]