Извлечение и замена элементов, удовлетворяющих условиям списка (массива) строк в Python

Бизнес

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

После краткого объяснения понимания списков, следующее содержание объясняется с помощью примера кода.

  • Извлечение на основе наличия или отсутствия определенной строки (частичное совпадение)
  • Заменить определенную строку
  • Извлечение, начиная или не начиная с определенной строки
  • Извлечение по окончанию или не окончанию определенной строки
  • Суждение и извлечение по делу
  • Преобразование заглавных и строчных букв
  • Определяет, используются ли алфавитные или цифровые символы, и извлекает их
  • Множественные условия
  • (компьютерное) регулярное выражение

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

обозначение включения в список

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

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

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

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

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

Содержит определенную строку (частичное совпадение)\ Не содержит: in

В выражении «конкретная строка в исходной строке» возвращает True, если исходная строка содержит конкретную строку. Это условное выражение.

Отрицание in осуществляется с помощью not in.

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']

l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']

Заменить определенную строку

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

Если нет строки, которую нужно заменить, нет необходимости выбирать элемент в условном выражении if, поскольку он не будет изменен в результате применения replace().

l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']

Если вы хотите заменить весь элемент, содержащий определенную строку, извлеките ее с помощью in и обработайте с помощью троичного оператора. Тернарный оператор записывается в следующей форме.
True Value if Conditional Expression else False Value

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

l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']

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

[('ZZZ' if ('XXX' in s) else s) for s in l]

Использование in в качестве условия вызывает путаницу с нотацией понимания списка in, но это не сложно, если вы знаете синтаксическую форму нотации понимания списка и тернарных операторов.

Начинается с определенной строки \ не начинается: startswith()

Строковый метод startswith() возвращает true, если строка начинается со строки, указанной в аргументе.

l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']

l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']

Заканчивается определенной строкой символов \ не заканчивается: endswith()

Строковый метод endswith() возвращает true, если строка заканчивается строкой, указанной в аргументе.

l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']

l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']

Суждение и извлечение по делу

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

l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']

Преобразование заглавных и строчных букв

Если вы хотите преобразовать все символы в верхний или нижний регистр, используйте строковые методы upper() и lower(). Другие методы включают в себя capitalize(), который выводит только первую букву, и swapcase(), который меняет местами прописные и строчные буквы.

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

l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']

l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']

Определяет, используются ли алфавитные или цифровые символы, и извлекает их

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

l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']

l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']

Множественные условия

Условное выражение, входящее в состав вычислений списка, может состоять из нескольких условий. Можно также использовать отрицательные условия «не».

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

l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']

l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']

(компьютерное) регулярное выражение

Регулярные выражения обеспечивают очень гибкую обработку.

Объект match, возвращаемый re.match() при совпадении, всегда определяется как true при оценке с условным выражением. Если он не совпадает, то возвращается None, что является ложью в условном выражении. Поэтому, если вы хотите извлечь только те элементы, которые соответствуют регулярному выражению, просто примените re.match() к части условного выражения в выражении понимания списка, как и раньше.

import re

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']

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

l_re_sub_all = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']

l_re_sub = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']
Copied title and URL