Для создания нового списка в 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» может быть опущено, в этом случае выражение применяется ко всем элементам.
Более подробную информацию, включая нотацию понимания вложенного списка, см. в следующей статье.
- СООТВЕТСТВУЮЩИЕ:Как использовать понимание списков в Python
Примените процесс ко всем элементам списка
Например, если вы хотите применить некоторую обработку ко всем элементам списка, опишите желаемую обработку в выражении 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]