Извлечение, замена и преобразование определенных элементов списков (массивов) Python

Бизнес

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

Ниже приводится пояснение, а также пример кода.

  • Основная форма обозначения понимания списка
  • Примените процесс ко всем элементам списка
  • Извлечение и удаление элементов из списка, которые соответствуют критериям
  • Замена или преобразование элементов, удовлетворяющих условиям списка

Конкретные примеры списков строк см. в следующей статье.

Также можно произвольно извлекать элементы, которые не соответствуют критериям.

Обратите внимание, что списки могут хранить различные типы данных и строго отличаются от массивов. Если вы хотите работать с массивами в процессах, где требуется размер памяти и адреса памяти или численная обработка больших данных, используйте array (стандартная библиотека) или NumPy.

В качестве примера можно привести следующий список

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Основная форма обозначения понимания списка

При генерации нового списка из списка списковые компиляции проще, чем циклы for.

[expression for any variable name in iterable object if conditional expression]

Выражение применяется к элементу, удовлетворяющему условному выражению итерируемого объекта (такого как список или кортеж), и становится элементом нового списка. Условное выражение «if» может быть опущено, в этом случае выражение применяется ко всем элементам.

Более подробную информацию, включая нотацию понимания вложенного списка, см. в следующей статье.

Примените процесс ко всем элементам списка

Например, если вы хотите применить некоторую обработку ко всем элементам списка, опишите желаемую обработку в выражении list comprehension, приведенном выше.

l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]

l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']

Это можно использовать для преобразования между списками чисел и списками строк.

Извлечение и удаление элементов из списка, которые соответствуют критериям

Если элемент должен быть выбран только условным выражением, он не обрабатывается выражением, поэтому оно принимает следующий вид

[variable name for variable name in original list if conditional expression]

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

l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]

l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]

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

l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

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

l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

Часть условного выражения может состоять из нескольких условий. Также можно использовать отрицательные знаки «не».

l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]

l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]

Замена или преобразование элементов, удовлетворяющих условиям списка

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

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

В языке Python троичный оператор можно записать следующим образом

True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100

b = 30
y = 100 if b > 50 else 0
print(y)
# 0

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

[True Value if Conditional Expression else False Value for any variable name in original list]

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

[(True Value if Conditional Expression else False Value) for any variable name in original list]

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

l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]

l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]

l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]

l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]
Copied title and URL