Я пытаюсь понять, как работают встроенные функции any()
и all()
Python.
Я пытаюсь сравнить кортежи так, что если какое-либо значение будет другим, оно вернется, True
а если они все одинаковые, то вернется False
. Как они работают в этом случае, чтобы вернуть [Ложь, Ложь, Ложь]?
d
является defaultdict(list)
.
print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
Насколько мне известно, это должно выводить
# [False, True, False]
поскольку (1,1) одинаковы, (5,6) различны, а (0,0) одинаковы.
Почему он оценивается как False для всех кортежей?
Ответы:
Вы можете примерно представить
any
иall
как ряд логическихor
иand
операторов, соответственно.любой
any
вернется,True
когда хотя бы один из элементов будет Истиной. Читайте о проверке истинности ценности.все
all
вернетсяTrue
только тогда, когда все элементы являются правдой.Таблица правды
Примечание 1: Пустой повторяемый случай объясняется в официальной документации, как это
any
Поскольку ни один из элементов не является истинным, он возвращается
False
в этом случае.all
Поскольку ни один из элементов не является ложным, он возвращается
True
в этом случае.Заметка 2:
Еще одна важная вещь, о которой нужно знать,
any
иall
это, она закоротит выполнение, как только они узнают результат. Преимущество заключается в том, что не нужно расходовать всю итерацию. Например,Здесь,
(not (i % 6) for i in range(1, 10))
это выражение генератора, которое возвращает,True
если текущее число в пределах 1 и 9 кратно 6.any
Итерируетmultiples_of_6
и, когда оно встречает6
, оно находит значение Истина, поэтому оно немедленно возвращаетсяTrue
, а остальная частьmultiples_of_6
не повторяется. Это то , что мы видим , когда мы выводимlist(multiples_of_6)
, результат7
,8
и9
.Эта превосходная вещь очень умно используется в этом ответе .
С этим базовым пониманием, если мы посмотрим на ваш код, вы делаете
что гарантирует, что, по крайней мере, одним из значений является Истина, но не все из них. Вот почему это возвращается
[False, False, False]
. Если вы действительно хотите проверить, не совпадают ли оба числа,источник
bool(data) and all(...)
должно работать.any
иall
взять итерируемые и вернуть,True
если любой и все (соответственно) из элементовTrue
.Если итерации пустые,
any
возвращаетсяFalse
иall
возвращаетсяTrue
.Я демонстрировал
all
иany
для студентов сегодня в классе. Они были в основном озадачены возвращаемыми значениями для пустых итерируемых элементов. Такое объяснение вызвало включение множества лампочек.Поведение быстрого доступа
Они,
any
иall
, как искать условия , что позволяет им прекратить оценивать. Первые примеры, которые я дал, требовали, чтобы они оценивали логическое значение для каждого элемента во всем списке.(Обратите внимание, что литерал списка сам по себе не вычисляется лениво - вы можете получить это с помощью итератора - но это только для иллюстративных целей.)
Вот реализация Python любого и всех:
Конечно, реальные реализации написаны на C и гораздо более производительны, но вы можете заменить вышеприведенное и получить те же результаты для кода в этом (или любом другом) ответе.
all
all
проверяет наличие элементовFalse
(чтобы они могли вернутьсяFalse
), а затем возвращает,True
если ни один из них не былFalse
.any
Способ
any
работает так, что он проверяет наличие элементовTrue
(поэтому он может возвращатьTrue), then it returns
Falseif none of them were
True`.Я думаю, что если вы будете помнить о кратковременном поведении, вы интуитивно поймете, как они работают, не обращаясь к таблице истинности.
Доказательства
all
иany
ярлыки:Сначала создайте noisy_iterator:
а теперь давайте с шумом перебираем списки, используя наши примеры:
Мы можем видеть
all
остановки на первой ложной проверке.И
any
останавливается на первой истинной булевой проверке:Источник
Давайте посмотрим на источник, чтобы подтвердить вышеизложенное.
Вот источник для
any
:И вот источник для
all
:источник
Python/bltinmodule.c
- я добавил это к вышеупомянутому.Я знаю, что это старо, но я подумал, что было бы полезно показать, как эти функции выглядят в коде. Это действительно иллюстрирует логику, лучше, чем текст или таблица IMO. В действительности они реализованы на C, а не на чистом Python, но они эквивалентны.
В частности, вы можете видеть, что результат для пустых итераций является естественным результатом, а не частным случаем. Вы также можете увидеть поведение короткого замыкания; на самом деле было бы больше работы, чтобы не было короткого замыкания.
Когда Гвидо ван Россум (создатель Python) впервые предложил добавить
any()
иall()
, он объяснил их, просто разместив в точности приведенные выше фрагменты кода.источник
Код, о котором вы спрашиваете, взят из моего ответа, приведенного здесь . Он был предназначен для решения проблемы сравнения множественных битовых массивов - т.е. коллекций
1
и0
.any
иall
полезны, когда вы можете положиться на «истинность» ценностей - то есть их значение в логическом контексте. 1 есть,True
а 0 -False
удобство, которое этот ответ использует. 5 тоже бываетTrue
, поэтому, когда вы смешиваете это с вашими возможными входами ... хорошо. Не работаетВместо этого вы можете сделать что-то вроде этого:
В нем отсутствует эстетика предыдущего ответа (мне очень понравился внешний вид
any(x) and not all(x)
), но он выполняет свою работу.источник
True
когда значения отличаются, длина набора должна быть 2, а не 1.источник
источник
Концепция проста:
источник
источник