Каб стварыць новы спіс са спісу (масіўу), элементамі якога з’яўляюцца радкі, шляхам здабывання толькі тых элементаў радкоў, якія задавальняюць пэўным умовам, або шляхам выканання замен, пераўтварэнняў і г.д., выкарыстоўвайце разуменне спісу.
Пасля кароткага тлумачэння разумення спісу наступны змест тлумачыцца з прыкладам кода.
- Выманне на аснове таго, ці ўключаны канкрэтны радок (частковае супадзенне)
- Замяніць пэўны радок
- Выманне, пачынаючы або не пачынаючы з пэўнага радка
- Выняць, заканчваючы або не заканчваючыся пэўным радком
- Судзілі і здабывалі па справе
- Пераўтварыць вялікія і малыя рэгістры
- Вызначае, ці выкарыстоўваюцца сімвалы алфавіту або лічбаў, і здабывае іх
- Некалькі ўмоў
- (кампутар) рэгулярны выраз
Звярніце ўвагу, што спісы могуць захоўваць розныя тыпы даных і строга адрозніваюцца ад масіваў. Калі вы хочаце апрацоўваць масівы ў працэсах, якія патрабуюць памеру памяці і адрасоў памяці або лікавай апрацоўкі вялікіх даных, выкарыстоўвайце масіў (стандартная бібліятэка) або NumPy.
- абазначэнне ўключэння ў спіс
- Змяшчае пэўную радок (частковае супадзенне) \ Не ўтрымлівае:in
- Замяніць пэўны радок
- Пачынаецца з пэўнага радка \ не пачынаецца:startswith()
- Заканчваецца пэўным сімвалам \ не канчаецца:endswith()
- Судзілі і здабывалі па справе
- Пераўтварыць вялікія і малыя рэгістры
- Вызначае, ці выкарыстоўваюцца сімвалы алфавіту або лічбаў, і здабывае іх
- Некалькі ўмоў
- (кампутар) рэгулярны выраз
абазначэнне ўключэння ў спіс
Пры стварэнні новага спісу са спісу разуменне спісу пісаць прасцей, чым для цыклаў.
[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 робіцца з не ў.
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()
Мэтад радка startswith() вяртае праўду, калі радок пачынаецца з радка, названага ў аргуменце.
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() вяртае праўду, калі радок заканчваецца радком, паказаным у аргуменце.
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']