Рубрики
Без рубрики

Понимание списка Python – всеобъемлющее руководство

Сообщение списка Python Разрешить мощные и читаемые мутации списка. В этой статье мы … помечены Python, функционально.

Сообщение списка Python Разрешить мощные и читаемые мутации списка. В этой статье мы узнаем много разных способов того, как их можно использовать и где они наиболее полезны.

Python – это невероятно мощный язык, который широко принят в широком спектре приложений. Как и с любым языком достаточной сложности, Python позволяет делать несколько способов делать вещи. Тем не менее, сообщество в целом согласилось с тем, что код должен следовать конкретному узору: будь «питон». В то время как «Pythonic» – это термин сообщества, официальный язык определяет, что они называют «Дзен Питона» в Пепе 20 Отказ Чтобы процитировать просто небольшой кусочек этого:

Явное лучше, чем неявное.

Просто лучше сложного.

Комплекс лучше, чем сложный.

Квартира лучше, чем вложенный.

Введен в Python 2.0 с PEP 202 , Поястины списка помогают выровнять некоторые из этих целей для общих операций в Python. Давайте рассмотрим, как мы можем использовать список списков и где они служат дзен Python лучше, чем альтернативы.

Что такое понимание списка?

Допустим, мы хотим сделать массив чисел, рассчитывая от 0 до 2. Мы могли бы назначить пустой массив, использовать Диапазон Создать генератор, то присоединиться к на этот массив используя для петля

numbers = []
for x in range(3):
    numbers.append(x)

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

numbers = [x for x in range(3)]

Смущено на синтаксисе? Давайте набросьте, что происходит токен-бэккен.

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

Во-вторых, у нас есть «X» до «для». Это возвращаемое значение. Это означает, что если мы изменим понимание:

numbers = [x*2 for x in range(3)]

Вместо «0, 1, 2», мы получили «0, 2, 4».

В дальнейшем у нас есть декларация о для петля. Это состоит из трех отдельных частей:

  1. ” для “- начало цикла
  2. ” x “- объявление имени переменной для назначения в каждой итерации
  3. ” в “- обозначает начало прослушивания для итератора

Наконец, у нас есть Диапазон Отказ Это действует как итератор для для петля, чтобы повторить. Это может быть заменено на что-нибудь для Цикл может пройти: список, кортеж или что-то еще, что реализует интерфейс итератора.

Это список пометки Pythonic?

Хотя может показаться, что он может показаться, чтобы узнать новый синтаксис для манипулирования списки, давайте посмотрим, как выглядит альтернатива. Использование карта мы можем пройти анонимную функцию (лямбда), чтобы умножить число на 2, пропустите Диапазон итерации. Однако после этого сделано, мы остались с карта объект. Для того, чтобы преобразовать это обратно в список, мы должны обернуть этот метод в список .

numbers = list(map(lambda x: x*2, range(3)))

Сравните это с версией понимания списка:

numbers = [x*2 for x in range(3)]

Глядя на понимание, это значительно больше читаемое с первого взгляда. Добраясь обратно в дзен Питона, «просто лучше, чем сложный,» список «Список, кажется, больше питон, чем использование карта Отказ

В то время как другие могут утверждать, что цикл «для» может быть легче читать, дзен Питона также упоминает «Квартира лучше, чем вложенные». Из-за этого список потенциалов для простого использования, как будто это, – это еще питон.

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

Фильтрация

Хотя может показаться понимание списка, только способна выполнять соответствие 1: 1, как карта Вы действительно можете реализовать логику более похожи на Фильтр Чтобы изменить количество предметов на выходе по сравнению с тем, что было введено.

Если мы добавим Если К концу заявления мы можем ограничить вывод только на даже номера:

even_numbers = [x for x in range(10) if x%2==0] #[0, 2, 4, 6, 8]

Это может быть в сочетании с измененной величиной мутации:

double_even_numbers = [x*2 for x in range(10) if x%2==0] #[0, 4, 8, 12, 16]

Условные условные

Хотя фильтрация может показаться единственным использованием Если В понимании списка вы можете использовать их для выполнения условных элементов для возврата разных значений из оригинала.

number_even_odd = ["Even" if x % 2 == 0 else "Odd" for x in range(4)]
# ["Even", "Odd", "Even", "Odd"]

Имейте в виду, вы даже можете объединить этот тройный метод с предыдущей фильтрацией Если :

thirds_even_odd = ["Even" if x % 2 == 0 else "Odd" for x in range(10) if x%3==0]
# [0, 3, 6, 9] after filtering numbers
# ["Even", "Odd", "Even", "Odd"] after ternary to string

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

thirds_even_odd = []
for x in range(10):
    if x%3==0:
        if x%2==0:
            thirds_even_odd.append("Even")
        else:
            thirds_even_odd.append("Odd")

Вложенные петли

Хотя мы объяснили, что вы можете иметь меньшие элементы на выходе, чем вход в нашем разделе «Фильтрующий» раздел, вы можете сделать напротив. Здесь мы можем расположены два «для» петлей друг на друга, чтобы иметь более длительный выход, чем наш начальный вход.

repeated_list = [y for x in ["", ""] for y in [1, 2, 3]]
# [1, 2, 3, 1, 2, 3]

Эта логика позволяет вам повторить две разные массивы и выводить конечное значение в вложенном цикле. Если мы должны переписать это, мы бы выписали это как:

repeated_list = []
for x in ["", ""]:
    for y in [1, 2, 3]:
        repeated_list.append(y)

Это позволяет нам гнездить петли и держать логику плоской. Однако в этом примере вы заметите, что мы не используем переменную «X». Давайте изменим это и сделайте расчеты на основе переменной «X», а также:

numbers_doubled = [y for x in [1, 2] for y in [x, x*2]]
# 1, 2, 2, 4

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

Вложенные понятия

Существует два факта, которые мы можем объединить, чтобы обеспечить понимание списка с супер-силой:

  1. Вы можете использовать списки внутри понимания списка
  2. Список список возвратов списков

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

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

row_list = [[1, 2], [3,4], [5,6]]
indexed_list = []
for i in range(2):
    indexed_row = []
    for row in row_list:
        indexed_row.append(row[i])
    indexed_list.append(indexed_row)

print(indexed_list)
# [[1, 3, 5], [2, 4, 6]]

Вы заметите, что первые проиндексированные элементы ( 1 , 3 , 5 ) находятся в первом массиве, а второй индексированные элементы ( 2 , 4 | 6 ) находятся во втором массиве.

Давайте возьмем это и преобразуйте его в список в списке:

row_list = [[1, 2], [3,4], [5,6]]
indexed_list = [[row[i] for row in row_list] for i in range(2)]
print(indexed_list)
# [[1, 3, 5], [2, 4, 6]]

Читаемые действия и другие операторы

Что-то, что вы, возможно, заметили, работая с пониманием списка, заключается в том, насколько близко некоторые из этих операторов находятся в типичном предложении. В то время как основные возможности служат это хорошо самостоятельно, они продвинуты подобные другим грамматическим грамматическим операторам Python. Например, операторы могут включать в себя:

  • и – логично “и”
  • или – логично “или”
  • не – логично “не”
  • это – проверка равенства
  • в – Членство чек/вторая половина для петля

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

vowels = 'aeiou'
word = "Hello!"

word_vowels = [letter for letter in word if letter.lower() in vowels]

print(word_vowels)

# ['e', 'o']

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

word_consonants = [letter for letter in word if letter.lower() not in vowels]
# ['H', 'l', 'l']

Наконец, чтобы продемонстрировать логику логику, мы сделаем легкую надумную проверку на номера, которые Mod 2 и 3 идеально, но не являются 4:

restricted_number = 4

safe_numbers = [x for x in range(6) if (x%2==0 or x%3==0) and x is not restricted_number]

# [0, 2, 3]

Заключение и задача

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

Например, с учетом этой кодовой панели кода перья длинного и грязного списка понимают, как вы можете восстановить для удаления всего использования списка? Избегайте использования карта , Фильтр или другие список помощников. Просто используйте вложенные для петли и Если Условные условные, соответствующие поведению, как это было раньше.

Смотрите код кода здесь

Это вопрос открытого вопроса, предназначенный для оспаривания ваших навыков, которые вы узнали по всей статье!

Застрявший? Желая поделиться своим решением? Присоединяйтесь к нашему сообществу Slack , где вы можете поговорить о соприкосновении списка и вызов углубленной с командой CoderPad!

Оригинал: “https://dev.to/this-is-learning/python-list-comprehension-the-comprehensive-guide-2lnb”