Элементтері жол болып табылатын тізімнен (массивтен) жаңа тізімді жасау үшін, белгілі бір шарттарды қанағаттандыратын жолдардың элементтерін ғана шығарып алу немесе ауыстыруларды, түрлендірулерді және т.б. орындау арқылы тізімді түсінуді пайдаланыңыз.
Тізімді түсінуге қысқаша түсініктеме бергеннен кейін келесі мазмұн үлгі кодымен түсіндіріледі.
- Белгілі бір жолдың қосылғанына немесе қосылмағанына негізделген шығару (жартылай сәйкестік)
- Арнайы жолды ауыстырыңыз
- Белгілі бір жолды бастау немесе бастамау арқылы шығарыңыз
- Белгілі бір жолмен аяқталуы немесе аяқталмауы арқылы шығарыңыз
- Іс бойынша сотталды және шығарылды
- Бас әріп пен кіші әріпті түрлендіру
- Алфавиттік немесе сандық таңбалардың пайдаланылғанын анықтайды және оларды шығарады
- Бірнеше шарттар
- (компьютер) тұрақты өрнек
Тізімдер деректердің әртүрлі түрлерін сақтай алатынын және массивтерден қатаң айырмашылығы бар екенін ескеріңіз. Жад өлшемі мен жад мекенжайларын немесе үлкен деректерді сандық өңдеуді қажет ететін процестерде массивтерді өңдеуді қаласаңыз, массив (стандартты кітапхана) немесе NumPy пайдаланыңыз.
- тізімді қосу белгісі
- Құрамында белгілі бір жол (жартылай сәйкестік) \ Құрамында жоқ:in
- Арнайы жолды ауыстырыңыз
- Белгілі бір жолдан басталады \ басталмайды:startswith()
- Белгілі бір таңба жолымен аяқталады \ end end емес:endswith()
- Іс бойынша сотталды және шығарылды
- Бас әріп пен кіші әріпті түрлендіру
- Алфавиттік немесе сандық таңбалардың пайдаланылғанын анықтайды және оларды шығарады
- Бірнеше шарттар
- (компьютер) тұрақты өрнек
тізімді қосу белгісі
Тізімнен жаңа тізім жасаған кезде, тізімді түсіну циклдерге қарағанда оңай жазылады.
[expression for any variable name in iterable object if conditional expression]
Егер элемент тек шартты өрнек арқылы таңдалса, ол өрнек арқылы өңделмейді, сондықтан ол келесі пішінді алады
[variable name for variable name in original list if conditional expression]
Егер шартты өрнек if not шартты өрнекке жасалса, ол теріске айналады және шартты өрнекті қанағаттандырмайтын элементтерді шығаруға болады.
Құрамында белгілі бір жол (жартылай сәйкестік) \ Құрамында жоқ:in
«Түпнұсқа жолдағы нақты жол» ішінде, егер түпнұсқа жолда арнайы жол болса, True мәнін қайтарады. Бұл шартты өрнек.
in терістеу 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']
Арнайы жолды ауыстырыңыз
Тізім элементтерінің жолын ауыстырғыңыз келсе, тізімді түсіну белгісіндегі әрбір элемент үшін ауыстыру() жол әдісін пайдаланыңыз.
Ауыстырылатын жол болмаса, 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']
Белгілі бір таңба жолымен аяқталады \ end end емес: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() және small() жол әдістерін пайдаланыңыз. Басқа әдістерге тек бірінші әріпті бас әріппен жазатын бас әріпті() және бас және кіші әріптерді ауыстыратын 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']