Элементүүд нь мөр болох жагсаалтаас (массив) шинэ жагсаалт үүсгэхийн тулд зөвхөн тодорхой нөхцөлийг хангасан мөрүүдийн элементүүдийг задлах, эсвэл орлуулах, хөрвүүлэх гэх мэтээр жагсаалтын ойлголтыг ашиглана.
Жагсаалтын талаарх товч тайлбарын дараа дараах агуулгыг жишээ кодоор тайлбарлав.
- Тодорхой тэмдэгт мөр орсон эсэхээс хамаарч задлах (хэсэгчилсэн таарах)
- Тодорхой мөрийг солих
- Тодорхой мөрөөр эхлүүлэх эсвэл эхлээгүй байдлаар задлах
- Тодорхой тэмдэгт мөрөөр төгсгөл эсвэл төгсгөлгүй байдлаар задлах
- Хэргийн дагуу шүүж, гаргаж авсан
- Том ба жижиг үсгийг хөрвүүлэх
- Үсгийн болон тоон тэмдэгт ашигласан эсэхийг тодорхойлж, тэдгээрийг задлана
- Олон нөхцөл
- (компьютер) тогтмол илэрхийлэл
Жагсаалт нь өөр өөр төрлийн өгөгдлийг хадгалах боломжтой бөгөөд массиваас эрс ялгаатай гэдгийг анхаарна уу. Хэрэв та санах ойн хэмжээ, санах ойн хаяг эсвэл том өгөгдлийн тоон боловсруулалт шаарддаг процессуудад массивыг зохицуулахыг хүсвэл массив (стандарт номын сан) эсвэл 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 not болзолт илэрхийлэл болговол энэ нь үгүйсгэл болж, нөхцөлт илэрхийллийг хангахгүй элементүүдийг гаргаж авч болно.
Тодорхой тэмдэгт мөрийг агуулсан (хэсэгчилсэн тохирох) \ Байгаагүй: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']
Тодорхой мөрийг солих
Хэрэв та жагсаалтын элементүүдийн мөрийг солихыг хүсвэл жагсаалтын ойлголтын тэмдэглэгээний элемент бүрийн хувьд string аргыг 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()
Хэрэв мөр нь аргументад заасан мөрөөр эхэлбэл string method 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()
Хэрэв мөр нь аргументад заасан тэмдэгт мөрөөр төгссөн бол string арга 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']
Том ба жижиг үсгийг хөрвүүлэх
Хэрэв та бүх тэмдэгтийг том эсвэл жижиг үсгээр хөрвүүлэхийг хүсвэл дээд() болон доод() мөрийн аргыг ашиглана уу. Бусад аргуудад зөвхөн эхний үсгийг томоор бичдэг том үсэг (), том жижиг үсгийг солих 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']