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

Как написать список пометков в Python

Добро пожаловать на еще один пост в серии Python. На этот раз я смотрю, чтобы вернуться назад … Теги с Python, начинающими, учебниками, программированием.

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

Проблема введения

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

nums = [2, 6, 10, -4] 
negative_nums = [x for x in nums if x < 0]

Что это за причудливый синтаксис, и как он работает? Это цель статьи сегодня. В частности, мы посмотрим на несколько сценариев, где понимание списка полезна, например:

  • Дублирование списка
  • Изменение списка
  • Фильтрация списка
  • Фильтрация и модификация списка
  • Генерировать все пары из двух списков
  • Дублирование вложенных списков

Если вы знаете что-нибудь еще, мы можем сделать со списком пониманием, дайте мне знать!

Растворы

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

output = [expression(item) for item in some_list]

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

output = [] 
for item in some_list: 
  output.append(expression(item))

Конечно, мы можем сделать намного больше, чем просто создать список из какого-либо другого списка со списком пониманием. В следующих подразделах мы посмотрим на несколько примеров.

Дублируйте список

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

my_list = [2, 5, -4, 6] 
output = [item for item in my_list] # [2, 5, -4, 6]

В этом случае вывод будет эквивалентно my_list Отказ Для полноты вот одно и то же решение, что и цикла:

my_list = [2, 5, -4, 6] 
output = [] 
for item in my_list: 
  output.append(item)

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

Изменить список *

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

my_list = [2, 5, -4, 6] 
output = [2 * item for item in my_list] # [4, 10, -8, 12]

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

my_list = [2, 5, -4, 6] 
output = [] 
for item in my_list: 
  output.append(item * 2)

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

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

Фильтр списка

Хотя дублирующиеся и модифицирующие списки – это весело, иногда полезно иметь возможность фильтровать список:

my_list = [2, 5, -4, 6] 
output = [item for item in my_list if item < 0] # [-4]

В этом случае мы добавили новое выражение до самой правой части понимания списка, который читает: Если элемент <0 Отказ Конечно, эквивалент петли может выглядеть что-то вроде следующего:

my_list = [2, 5, -4, 6] 
output = [] 
for item in my_list: 
  if item < 0: 
    output.append(item)

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

Фильтр и изменить список

Естественно, мы можем одновременно модифицировать, так и отфильтровать список, объединяя синтаксис:

my_list = [2, 5, -4, 6] 
output = [2 * item for item in my_list if item < 0] # [-8]

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

my_list = [2, 5, -4, 6] 
output = [] 
for item in my_list: 
  if item < 0: 
    output.append(item * 2)

В результате выходной список содержит только -8 Отказ Еще раз, важно отметить, что мы на самом деле не модифицировать Оригинальный список.

Генерировать все пары из двух списков

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

# [(1, 2), (1, 4), (1, 6), (3, 2), (3, 4), (3, 6), (5, 2), (5, 4), (5, 6)] 
output = [(a, b) for a in (1, 3, 5) for b in (2, 4, 6)]

Здесь мы создали список, содержащие все комбинации пар из двух списков. Как обычно, мы можем реализовать то же самое со следующим набором циклов:

output = [] 
for a in (1, 3, 5): 
  for b in (2, 4, 6): 
    output.append((a, b))

Если бы мы хотели сделать все интереснее, мы могли бы применить некоторую фильтрацию:

# [(3, 2), (5, 2), (5, 4)] 
output = [(a, b) for a in (1, 3, 5) for b in (2, 4, 6) if a > b]

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

Дублирующиеся вложенные списки

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

my_list = [[1, 2], [3, 4]] 
output = [[item for item in sub_list] for sub_list in my_list] 
print(output) # Prints [[1, 2], [3, 4]]

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

def deep_copy(to_copy): 
  if type(to_copy) is list: 
    return [deep_copy(item) for item in to_copy] 
  else: 
    return to_copy

Как это круто? Конечно, если у вас есть что-то кроме чисел или строк на самых глубоких уровнях вашей матрицы, вам придется справиться с остальным процессом клонирования.

Немного повтора

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

# Define a generic 1D list of constants 
my_list = [2, 5, -4, 6] 

# Duplicate a 1D list of constants 
[item for item in my_list] 

# Duplicate and scale a 1D list of constants 
[2 * item for item in my_list] 

# Duplicate and filter out non-negatives from 1D list of constants 
[item for item in my_list if item < 0] 

# Duplicate, filter, and scale a 1D list of constants 
[2 * item for item in my_list if item < 0] 

# Generate all possible pairs from two lists 
[(a, b) for a in (1, 3, 5) for b in (2, 4, 6)] 

# Redefine list of contents to be 2D 
my_list = [[1, 2], [3, 4]] 

# Duplicate a 2D list 
[[item for item in sub_list] for sub_list in my_list] 

# Duplicate an n-dimensional list 
def deep_copy(to_copy): 
  if type(to_copy) is list: 
    return [deep_copy(item) for item in to_copy] 
  else: 
    return to_copy

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

Тем временем, почему бы не проверить некоторые из этих других потрясающих стажеров Python:

И, если вы чувствуете себя более щедрым, пройдите через Страница членов и посмотрите на ваши варианты. Вы можете попробовать, прежде чем купить. Вот почему есть Бесплатный вариант Отказ Во всяком случае, снова спасибо за поддержку. Возвращайся скорее!

Оригинал: “https://dev.to/renegadecoder94/how-to-write-a-list-comprehension-in-python-n58”