Вилучення та заміна елементів, які задовольняють умовам списку (масиву) рядків у Python

Бізнес

Щоб створити новий список зі списку (масиву), елементами якого є рядки, шляхом вилучення лише елементів рядків, які задовольняють певним умовам, або шляхом виконання підстановок, перетворень тощо, використовуйте осмислення списку.

Після короткого пояснення розуміння списку, наступний зміст пояснюється зі зразком коду.

  • Вилучення на основі того, чи включено певний рядок (часткова відповідність)
  • Замінити певний рядок
  • Витягніть, починаючи або не починаючи з певного рядка
  • Витягніть, закінчуючи чи не закінчуючи певним рядком
  • Судять і витягують по справі
  • Перетворення великого та малого регістру
  • Визначає, чи використовуються символи алфавіту чи цифри, і витягує їх
  • Кілька умов
  • (комп’ютерний) регулярний вираз

Зауважте, що списки можуть зберігати різні типи даних і суворо відрізняються від масивів. Якщо ви хочете обробляти масиви в процесах, які вимагають розміру пам’яті та адрес пам’яті або чисельної обробки великих даних, використовуйте масив (стандартна бібліотека) або 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 як умови збиває з пантелику з нотацією розуміння списку в, але це не важко, якщо ви знаєте про синтаксичну форму нотації розуміння списку та потрійні оператори.

Починається з певного рядка \ не починається:startswith()

Метод string 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()

Метод string 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']

(комп’ютерний) регулярний вираз

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

Об’єкт відповідності, який повертає re.match(), коли він відповідає, завжди визначається як істинний, коли оцінюється за допомогою умовного виразу. Якщо він не збігається, він повертає 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(), який замінює відповідну частину регулярного виразу, також корисний. Щоб витягти й замінити лише відповідні елементи, просто додайте «якщо умовний вираз».

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']