Да бисте генерисали нову листу из листе (низа) чији су елементи стрингови, издвајањем само елемената низова који задовољавају одређене услове, или вршењем замена, конверзија итд., користите разумевања листе.
Након кратког објашњења разумевања листе, следећи садржаји су објашњени са примером кода.
- Екстракција заснована на томе да ли је одређени стринг укључен или не (делимично подударање)
- Замените одређени низ
- Издвојите тако што ћете започети или не почети са одређеним низом
- Издвој тако што се завршава или не завршава одређеним низом
- Пресуђено и извучено по случају
- Претворите велика и мала слова
- Одређује да ли се користе алфабетски или нумерички знакови и издваја их
- Више услова
- (компјутерски) регуларни израз
Имајте на уму да листе могу да чувају различите типове података и да се стриктно разликују од низова. Ако желите да рукујете низовима у процесима који захтевају величину меморије и меморијске адресе или нумеричку обраду великих података, користите низ (стандардна библиотека) или НумПи.
- нотација укључивања листе
- Садржи одређени стринг (делимично подударање) \ Не садржи: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]
Ако се условни израз иф претвори у ако не условни израз, он постаје негација, а елементи који не задовољавају условни израз могу се издвојити.
Садржи одређени стринг (делимично подударање) \ Не садржи: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']
Замените одређени низ
Ако желите да замените низ елемената листе, користите метод стринг реплаце() за сваки елемент у нотацији разумевања листе.
Ако нема стринга који треба заменити, нема потребе да изаберете елемент у условном изразу иф јер се неће променити применом реплаце().
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Ако желите да замените цео елемент који садржи одређени стринг, издвојите га са ин и обрадите га тернарним оператором. Тернарни оператор је написан у следећем облику.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]
Употреба ин као услова је збуњујућа са нотацијом разумевања листе у, али није тешко ако сте свесни синтаксичке форме нотације за разумевање листе и тернарних оператора.
Почиње са одређеним стрингом \ не почиње: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()
Метода стринга ендсвитх() враћа тачно ако се стринг завршава стрингом наведеним у аргументу.
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']
Пресуђено и извучено по случају
Методе стрингова исуппер(),исловер() се могу користити за одређивање да ли је стринг само великим или малим словима.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Претворите велика и мала слова
Ако желите да конвертујете све знакове у велика или мала слова, користите методе стрингова уппер() и ловер(). Остале методе укључују капитализе(), која пише само прво слово великим словима, и свапцасе(), која замењује велика и мала слова.
Као у горњем примеру замене, користите тернарни оператор ако желите да обрадите само елементе који задовољавају услов.
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']
Одређује да ли се користе алфабетски или нумерички знакови и издваја их
Методе стрингова исалпха() и иснумериц() се могу користити да би се утврдило да ли је стринг сав алфабетски, нумерички итд.
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']
(компјутерски) регуларни израз
Регуларни изрази омогућавају веома флексибилну обраду.
Објекат подударања који враћа ре.матцх() када се подудара увек је утврђен као тачан када се процењује помоћу условног израза. Ако се не подудара, враћа Ноне, што је нетачно у условном изразу. Дакле, ако желите да издвојите само елементе који одговарају регуларном изразу, само примените ре.матцх() на део условног израза израза за разумевање листе као и раније.
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']
ре.суб(), који замењује подударни део регуларног израза, такође је користан. Да бисте издвојили и заменили само подударне елементе, само додајте „ако условни израз“.
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']