Какие выражения вернут непустой список

от admin

Как проверить, пуст ли список в Python

В этом уроке мы рассмотрим примеры того, как проверить, пуст ли список в Python. Мы будем использовать функцию len (), рекомендуемый стиль Pep8, а также функцию bool ().

  • Автор записи

Как проверить, пуст ли список в Python

Вступление

Списки-это одна из четырех наиболее часто используемых структур данных, предоставляемых Python. Его функциональность, расширяемость и простота использования делают его полезным для реализации различных типов функциональных возможностей.

Списки Python имеют несколько интересных характеристик:

  1. Изменчивость – означает, что он может изменяться, что означает, что он позволяет нам легко добавлять и удалять записи из него. Это основное различие между списками Python и кортежами
  2. Итерабельность – что означает, что мы можем итерировать через него (пройти через все элементы в списке по порядку)

Основным атрибутом, на котором будет сосредоточено внимание, является Итеративность . Важной частью при работе с итеративным объектом, в данном случае списком, является проверка того, есть ли что-то для итерации. Если не обращаться с ними должным образом, это может привести к большому количеству нежелательных ошибок.

Python предоставляет различные способы проверки того, пуст наш список или нет, некоторые неявные и некоторые явные, и в этой статье мы рассмотрим как проверить, пуст ли список Python .

  • Использование функции len()
  • Использование len() С Оператором сравнения
  • Сравнение с пустым списком
  • Pep-8 Рекомендуемый стиль (Самый популярный и рекомендуемый)
  • Использование функции bool()

Использование функции len()

Один из методов состоит в том, чтобы использовать функцию len () , чтобы проверить, пуст ли наш список или нет:

Когда len(py_list) выполняется, он производит ноль, который затем неявно приводится к логическому значению False . Таким образом, в случае пустого списка программа будет перенаправлена в блок else.

Хотя этот метод выглядит простым, он не настолько интуитивно понятен для начинающих.

Использование len() С Оператором Сравнения

Эта техника похожа на описанную выше, но она более ясна и понятна. Вот почему те, кто новичок в python или самом кодировании, обычно считают его более интуитивным:

В приведенном выше коде len(py_list) будет true, если список пуст и будет перенаправлен в блок else. Это также позволяет вам устанавливать и другие значения, а не полагаться на них. 0 преобразуется как False . Все остальные положительные значения преобразуются в Правда .

Сравнение С Пустым Списком

Этот метод также очень прост и хорошо работает для начинающих, так как он включает в себя сравнение с пустым списком:

Здесь мы снова используем операцию сравнения для сравнения одного списка с другим – am empty one, и если оба списка пусты, то будет выполнен блок if .

Рекомендуемый стиль Pep-8

Для этого давайте взглянем на Тестирование истинностных значений . Официальные документы утверждают, что:

Вот большинство встроенных объектов,которые считаются ложными:

  • константы, определенные как false: None и False.
  • константы, определенные как false: None и False.
  • ноль любого числового типа: 0, 0.0, 0j, Десятичная дробь(0), Дробь(0, 1)

Поскольку пустой список на самом деле является просто пустой коллекцией, он будет преобразован в логическое значение False . Поэтому, если py_list пуст, он будет преобразован в False .

Второе утверждение довольно похоже, за исключением того, что not инвертирует ложное условие в истинное. Этот подход очень похож на if(len(list)) подход.

Это предпочтительный подход, поскольку это самое чистое и короткое решение.

Это предпочтительный подход, поскольку это самое чистое и короткое решение.

Мы также можем использовать функцию bool() для проверки пустоты списка:

Это в основном вручную реализованный тест истинностного значения. Поэтому, если список не пуст, функция вернет True и если блок будет выполнен.

Этот подход менее распространен , так как мы можем достичь желаемых результатов даже без использования bool () , но это не так уж плохо.

Этот подход менее распространен , поскольку мы можем достичь желаемых результатов даже без использования || bool ()||, но неплохо знать, как работает Python под капотом.

Эта статья была посвящена тому, как проверить, пуст ли наш список python или нет. Мы начали с изучения различных техник и, наконец, изучили некоторые параметры, которые мы можем использовать, чтобы сделать наше суждение о том, какая техника может работать для нас.

Я не могу сказать, что это конец, поскольку новые обновления Python могут привести к появлению новых и более совершенных стилей кодирования. Так что лучше продолжать исследовать и продолжать учиться.

Вернуть первый непустой список лениво в Java 8

У меня есть N списков, которые возвращают данные из репозитория. Я хочу вернуть первый непустой из этих трех списков (каждый из них выполняет разные SQL для извлечения данных).

Суть в том, что я хочу сделать это лениво, чтобы мне не нужно было выполнять SQL в базе данных, если я уже нашел приемлемый результат. Мой код (изменен)

Это работает, но это не ленивый. Любые идеи?

2 ответа

Вы можете составить поток поставщиков и оценить их в порядке очередности, пока не найдете результат:

Каждый поставщик определяет, как получить доступ к набору результатов, фактически не пытаясь его выполнить, пока не будет выполнено map() . Поскольку filter() и map() являются без сохранения состояния , каждый поставщик будет вызван и его результат будет проверен перед попыткой следующего. Если найден непустой результат, поток будет немедленно прерван, потому что findFirst() является короткое замыкание .

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

Как проверить, пустой ли список в Python

Чтобы проверить, пуст ли список в Python, вы можете написать условие, если длина списка равна нулю. Или вы можете напрямую использовать ссылку на список вместе с оператором not в качестве условия в операторе if.

Ниже приводится синтаксис для использования оператора not и список в качестве условия для проверки того, является ли список пустым.

В приведенном выше операторе If операторы внутри блока выполняются только в том случае, если myList не пуст.

Ниже приводится синтаксис использования длины списка для формирования условия проверки того, является ли список пустым.

Если список пуст, то в нем будет ноль элементов. Используйте встроенную функцию len() и передайте список в качестве аргумента. Функция возвращает целое число, представляющее количество элементов в списке. Если список пуст, len() возвращает 0, а условие len (myList) == 0 становится истинным.

Пример 1

В следующей программе мы инициализируем пустой список и программно проверяем, является ли список пустым или нет, используя оператор not и ссылку на список.

Пример 2

В следующей программе мы инициализируем пустой список и программно проверяем, является ли список пустым или нет, с помощью функции len().

Как проверить, если список пуст?

Использование неявной логичности пустого списка довольно pythonic.

Пифонический способ сделать это из руководства по стилю PEP 8 (где » Да» означает «рекомендуется» и » Нет» означает «не рекомендуется»):

Для последовательностей (строки, списки, кортежи) используйте тот факт, что пустые последовательности являются ложными.

Я предпочитаю это явно:

Таким образом, на 100% ясно, что li — это последовательность (список), и мы хотим проверить ее размер. Моя проблема с if not li: . заключается в том, что она дает ложное впечатление о том, что li является логической переменной.

Другие люди, похоже, обобщают вопрос, выходящий за рамки списков, поэтому я подумал, что добавлю оговорку для другого типа последовательности, которую могут использовать многие люди, тем более, что это первый хит Google для «пустого массива python», ,

Другие методы не работают для массивов numpy

Вы должны быть осторожны с массивами numpy, потому что другие методы, которые отлично работают для list или других стандартных контейнеров, не работают для массивов numpy. Я объясняю, почему ниже, но, короче говоря, предпочтительным методом является использование size .

Читать:
Как начать unity заново

«Питонический» способ не работает: Часть 1

«Pythonic» способ выходит из строя с массивами numpy, потому что numpy пытается передать массив массиву bool s, и if x пытается оценить все эти bool сразу для какого-то совокупного значения истины. Но это не имеет никакого смысла, поэтому вы получаете ValueError :

«Питонический» способ не работает: Часть 2

Но, по крайней мере, вышеприведенный случай говорит вам, что он не прошел. Если у вас есть массив numpy с ровно одним элементом, оператор if будет «работать» в том смысле, что вы не получите ошибку. Однако, если этот один элемент имеет значение 0 (или 0.0 или false . ), оператор if неверно приведет к false :

Но ясно, что x существует и не пусто! Этот результат не то, что вы хотели.

Использование len может дать неожиданные результаты

возвращает 1, хотя массив имеет нулевые элементы.

Неожиданно

Как объяснено в Scipy FAQ, правильный метод во всех случаях, когда вы знаете, что у вас есть массив numpy, следует использовать, if x.size :

Если вы не уверены, может ли это быть list , массив numpy или что-то еще, вы могли бы объединить этот подход с ответом @dubiousjim, чтобы убедиться, что для каждого типа используется правильный тест. Не очень «pythonic», но оказывается, что numpy намеренно сломал питоничность, по крайней мере, в этом смысле.

Если вам нужно сделать больше, чем просто проверить, является ли вход пустым, и вы используете другие функции numpy, такие как индексирование или математические операции, он, вероятно, более эффективен (и, конечно, более распространен), чтобы заставить входной массив быть массивом numpy. Есть несколько хороших функций для этого быстро — самое главное numpy.asarray . Это берет ваш вход, ничего не делает, если он уже является массивом или переносит ваш ввод в массив, если он является списком, кортежем и т.д., И, возможно, преобразует его в выбранный dtype . Так что это очень быстро, когда это может быть, и это гарантирует, что вы просто догадываетесь, что ввод представляет собой массив numpy. Обычно мы просто используем одно и то же имя, так как преобразование в массив не будет выводиться за пределы текущей области:

Это сделает x.size проверки x.size во всех случаях, которые я вижу на этой странице.

Пустой список сам по себе считается ложным при тестировании истинных значений (см. документация python):

EDIT: Еще одна точка против тестирования пустой список: False: как насчет полиморфизм? Вы не должны зависеть от список — список. Он должен просто шарлатан как утка — как ты собираешься получить утку «False», если у него нет элементов?

Ваш duckCollection должен реализовать __nonzero__ или __len__ , поэтому if: будет работать без проблем.

Лучший способ проверить, пустой ли список

Например, если передано следующее:

Как проверить, нет ли пустого?

Короткий ответ:

Поместите список в логический контекст (например, с оператором if или while ). Он будет проверять False если он пуст, и True противном случае. Например:

Обращение к власти

PEP 8, официальное руководство по стилю Python для кода Python в стандартной библиотеке Python, утверждает:

Для последовательностей (строки, списки, кортежи) используйте тот факт, что пустые последовательности являются ложными.

Мы должны ожидать, что стандартный библиотечный код должен быть максимально реалистичным и правильным. Но почему это так, и зачем нам это руководство?

объяснение

Я часто вижу такой код от опытных программистов, новых для Python:

И у пользователей ленивых языков может возникнуть соблазн сделать это:

Они верны на других языках. И это даже семантически корректно в Python.

Но мы считаем его не-Pythonic, потому что Python поддерживает эту семантику непосредственно в интерфейсе объектов списка с помощью логического принуждения.

Из документов (и обратите внимание на включение пустого списка, [] ):

  • константы, определенные как ложные: None и False .
  • ноль любого числового типа: 0 , 0.0 , 0j , Decimal(0) , Fraction(0, 1)
  • пустые последовательности и коллекции: » , () , [] , <> , set() , range(0)

И документация datamodel:

object.__bool__(self)

Вызывается для реализации тестирования ценности истины и встроенной операции bool() ; должен возвращать False или True . Когда этот метод не определен, __len__() , если он определен, и объект считается истинным, если его результат отличен от нуля. Если класс не определяет ни __len__() ни __bool__() , все его экземпляры считаются истинными.

object.__len__(self)

Вызывается для реализации встроенной функции len() . Должен возвращать длину объекта, целое число> = 0. Кроме того, объект, который не определяет __bool__() метод __len__() возвращает ноль, считается ложным в булевом контексте.

Поэтому вместо этого:

Выполнение того, что Pythonic обычно окупается в производительности:

Оплачивается ли это? (Обратите внимание, что меньше времени для выполнения эквивалентной операции лучше 🙂

Для масштаба, здесь стоимость вызова функции и построения и возврата пустого списка, который вы могли бы вычесть из стоимости проверок пустоты, используемых выше:

Мы видим, что либо проверка длины с встроенной функцией len по сравнению с 0 либо проверка на пустой список намного менее эффективны, чем использование встроенного синтаксиса языка, как задокументировано.

Для len(a) == 0 проверьте:

Первый Python должен проверять глобальные переменные, чтобы увидеть, будет ли len затенена.

Затем он должен вызвать функцию, загрузить 0 и выполнить сравнение равенства в Python (вместо C):

И для [] == [] он должен создать ненужный список, а затем снова выполнить операцию сравнения в виртуальной машине Python (в отличие от C)

Путь «Pythonic» намного проще и быстрее, так как длина списка кэшируется в заголовке экземпляра объекта:

Данные из источника C и документации

PyVarObject

Это расширение PyObject которое добавляет поле ob_size . Это используется только для объектов, которые имеют некоторое понятие длины. Этот тип не часто появляется в API Python/C. Он соответствует полям, определяемым расширением макроса PyObject_VAR_HEAD .

Мне понравилось исследовать это, и я много времени уделяю своим ответам. Если вы думаете, что я оставляю что-то, пожалуйста, дайте мне знать в комментарии.

Ответ Патрика (принят) прав: if not a: — это правильный способ сделать это. Ответ Harley Holcombe прав, что это в руководстве по стилю PEP 8. Но ни один из ответов не объясняет, почему хорошая идея следовать за идиомой — даже если вы лично найдете ее недостаточно явной или запутанной для пользователей Ruby или что-то еще.

Код Python и сообщество Python имеют очень сильные идиомы. После этих идиом ваш код легче читать для любого, кто имеет опыт работы на Python. И когда вы нарушаете эти идиомы, это сильный сигнал.

Истинно, что if not a: не выделяет пустые списки из None , или числовые 0, или пустые кортежи, или пустые созданные пользователем типы коллекций, или пустые созданные пользователем типы не-вполне коллекции, или одиночные -элементный массив NumPy, действующий как скаляры с ложными значениями и т.д. И иногда важно быть явным. И в этом случае вы знаете, о чем хотите быть явным, поэтому вы можете точно это проверить. Например, if not a and a is not None: означает «что-либо ложное, кроме None», а if len(a) != 0: означает «только пустые последовательности — и все, кроме последовательности, является ошибкой здесь» и т.д.). Помимо тестирования для того, что вы хотите проверить, это также сигнализирует читателю, что этот тест важен.

Но если у вас нет ничего, о чем нужно говорить, ничего, кроме if not a: , вводит в заблуждение читателя. Вы сигнализируете что-то важное, когда это не так. (Возможно, вы также делаете код менее гибким или медленным, или что-то еще, но это все менее важно.) И если вы обычно вводите в заблуждение читателя, как это, тогда, когда вам нужно сделать различие, это пройдет незамеченным, потому что вы были «плачущим волком» по всему вашему коду.

Related Posts