String-тэй адил жагсаалт нь утгуудын дараалал юм. String дэх утгууд нь тэмдэгтүүд байдаг бол жагсаалтад тэд ямар ч төрлийн байж болно. Жагсаалтад байгаа утгуудыг element (элемент) эсвэл заримдаа item (зүйл) гэж нэрлэдэг.
Шинэ жагсаалт үүсгэх хэд хэдэн арга байдаг.
Хамгийн энгийн нь элементүүдийг дөрвөлжин хаалтанд ("["hhe"]") хаах явдал юм:
[10, 20, 30, 40]
['crunchy frog', 'ram bladder', 'lark vomit']
Эхний жишээ бол дөрвөн бүхэл тоонуудын list юм. Хоёр дахь нь гурван string агуулсан list юм. Жагсаалтын элементүүд нь нэг төрлийн байх албагүй. Дараах list нь string, float, int болон өөр жагсаалтыг агуулна:
['spam', 2.0, 5, [10, 20]]
Элемент агуулаагүй жагсаалтыг хоосон жагсаалт гэж нэрлэдэг. Xоосон хаалтаар үүсгэж болно, []. Жагсаалтын ямар нэгэн увьсагчид оноож болно:
>>> cheeses = ['Cheddar', 'Edam', 'Gouda']
>>> numbers = [17, 123]
>>> empty = []
>>> print(cheeses, numbers, empty)
['Cheddar', 'Edam', 'Gouda'] [17, 123] []
Жагсаалтын элементүүдэд хандах синтаĸс нь string-ийн тэмдэгтүүдэд хандахтай адил байна: [ ] хаалт оператор ашиглана. Хаалт доторх илэрхийлэл нь индеĸсийг зааж өгдөг. Индеĸсүүд 0-ээс эхэлдэг гэдгийг санаарай:
>>> print(cheeses[0])
Cheddar
String-ээс ялгаатай нь жагсаалтууд нь өөрчлөгдөх боломжтой, учир нь та жагсаалт дахь зүйлсийн дарааллыг өөрчлөх эсвэл жагсаалтын зүйлийг дахин хуваарилах боломжтой:
>>> numbers = [17, 123]
>>> numbers[1] = 5
>>> print(numbers)
[17, 5]
Өмнө нь тоонуудын нэг index-тэй элемент нь 123 байсныг 5 болгов. Жагсаалтыг индеĸс ба элементүүдийн хоорондын хамаарал гэж үзэж болно. Үүнийг mapping гэдэг.
Жагсаалтын индеĸсүүд нь мөрийн индеĸсүүдтэй адилхан ажилладаг: Аливаа бүхэл илэрхийллийг индеĸс болгон ашиглаж болно. Хэрэв та байхгүй элементийг унших эсвэл бичихийг оролдвол IndexError гарч ирнэ.
Хэрэв индеĸс сөрөг утгатай байвал жагсаалтын төгсгөлөөс хойш тоолно. "in" оператор нь жагсаалт дээр бас ажилладаг:
>>> cheeses = ['Cheddar', 'Edam', 'Gouda']
>>> 'Edam' in cheeses
True
>>> 'Brie' in cheeses
False
Жагсаалтын элементүүд дээр гүйлгэх хамгийн түгээмэл арга бол for loop юм. Синтаĸс нь string- ийнхтэй адил байна:
for cheese in cheeses:
print(cheese)
Хэрэв та зөвхөн жагсаалтын элементүүдийг унших шаардлагатай бол дээрх арга оновчтой. Гэхдээ хэрэв элемент нэмэх эсвэл шинэчлэхийг хүсвэл индеĸсүүд хэрэгтэй. Үүнийг хийх нийтлэг арга бол range болон len фунĸцуудыг нэгтгэх явдал юм:
for i in range(len(numbers)):
numbers[i] = numbers[i] * 2
Хоосон жагсаалт дээрх for loop нь body-ийг хэзээ ч гүйцэтгэдэггүй:
for x in empty:
print('Хэзээ ч хэвлэгдэхггүй текст.')
Жагсаалт нь өөр жагсаалт агуулж болох ч үүрлэсэн жагсаалт нь нэг элемент гэж тоологддог. Энэ жагсаалтын урт нь гэсэн үг:
['spam', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]
+ оператор нь жагсаалтыг нэгтгэдэг:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = a + b
>>> print(c)
[1, 2, 3, 4, 5, 6]
Үүний нэгэн адил * оператор нь жагсаалтыг өгөгдсөн тооны удаа давтдаг:
>>> [0] * 4
[0, 0, 0, 0]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
Slice оператор нь жагсаалт дээр мөн ажилладаг:
>>> t = ['a', 'b', 'c', 'd', 'e', 'f']
>>> t[1:3]
['b', 'c']
>>> t[:4]
['a', 'b', 'c', 'd']
>>> t[3:]
['d', 'e', 'f']
Хэрэв та эхний индеĸсийг бичихгүй орхисон бол slice нь эхнээс нь эхэлнэ. Хэрэв та хоёр дахь хэсгийг орхих юм бол slice нь төгсгөл хүртэл явагдана. Тиймээс хэрэв та хоёуланг нь орхисон бол зүсмэл нь бүхэл бүтэн жагсаалтын хуулбар болно.
>>> t[:]
['a', 'b', 'c', 'd', 'e', 'f']
Жагсаалт нь өөрчлөгдөх чадвартай тул жагсаалтыг нугалах, эргүүлэх, эвдэх үйлдлүүдийг хийхээс өмнө хуулбарлах нь ихэвчлэн хэрэгтэй байдаг. Оногдуулалтын зүүн талд байгаа slice оператор нь хэд хэдэн элементийг шинэчлэх боломжтой:
>>> t = ['a', 'b', 'c', 'd', 'e', 'f']
>>> t[1:3] = ['x', 'y']
>>> print(t)
['a', 'x', 'y', 'd', 'e', 'f']
Python нь жагсаалт дээр ажилладаг method-уудтай байдаг.
Жишээлбэл: append нь жагсаалтын төгсгөлд шинэ элемент нэмнэ:
>>> t = ['a', 'b', 'c']
>>> t.append('d')
>>> print(t)
['a', 'b', 'c', 'd']
extend нь жагсаалтыг аргумент болгон авч, бүх элементүүдийг нэгтгэнэ:
>>> t1 = ['a', 'b', 'c']
>>> t2 = ['d', 'e']
>>> t1.extend(t2)
>>> print(t1)
['a', 'b', 'c', 'd', 'e']
sort нь жагсаалтын элементүүдийг багаас өндөр хүртэл эрэмбэлж байрлуулна:
>>> t = ['d', 'c', 'e', 'b', 'a']
>>> t.sort()
>>> print(t)
['a', 'b', 'c', 'd', 'e']
Жагсаалтын ихэнх методууд void байдаг. Тэд жагсаалтыг өөрчилдөг ба None буцаана. Хэрэв та
санамсаргүйгээр
t = t.sort() гэж бичвэл үр дүнд нь сэтгэл дундуур байх болно.
Жагсаалтаас элементүүдийг устгах хэд хэдэн арга байдаг. Хэрэв та хүссэн элементийнхээ индеĸсийг мэддэг бол pop-г ашиглаж болно:
>>> t = ['a', 'b', 'c']
>>> x = t.pop(1)
>>> print(t)
['a', 'c']
>>> print(x)
b
pop нь жагсаалтыг өөрчилж, устгасан элементийг буцаана. Хэрэв та индеĸс өгөхгүй бол энэ нь устгаж, сүүлчийн элементийг буцаана.
Хэрэв танд устгасан утга хэрэггүй бол del хэллэгийг ашиглаж болно:
>>> t = ['a', 'b', 'c']
>>> del t[1]
>>> print(t)
['a', 'c']
Хэрэв та устгахыг хүсч буй элементээ мэддэг (харин индеĸсийг биш) бол remove ашиглаж болно:
>>> t = ['a', 'b', 'c']
>>> t.remove('b')
>>> print(t)
['a', 'c']
Нэгээс олон элементийг устгахын тулд del-г slice-тай ашиглаж болно:
>>> t = ['a', 'b', 'c', 'd', 'e', 'f']
>>> del t[1:5]
>>> print(t)
['a', 'f']
Эргээд сануулахад, slice-ын нь хоёр дахь индеĸс хүртэлх бүх элементүүдийг сонгоно, гэхдээ өөрийг нь оруулахгүй. [1:5] гэсэн бол 1,2,3,4 индеĸстэй элементүүдийг сонгоно.
List дээр ашиглагдах хэд хэдэн суулгагдсан фунĸцууд байдаг бөгөөд энэ нь loop бичихгүйгээр жагсаалтыг хурдан гүйлгэж үзэх боломжийг олгодог.
>>> nums = [3, 41, 12, 9, 74, 15]
>>> print(len(nums))
6
>>> print(max(nums))
74
>>> print(min(nums))
3
>>> print(sum(nums))
154
>>> print(sum(nums)/len(nums))
25
sum() фунĸц нь жагсаалтын элементүүд нь тоо байх үед л ажиллана. Бусад фунĸцууд (max(),len() гэх мэт) нь string жагсаалт болон хооронд нь харьцуулж болох бусад төрлүүдтэй ажилладаг.
Бид list ашиглан хэрэглэгчийн оруулсан тоонуудын дундажийг тооцдог өмнөх программыг дахин бичье. Эхлээд List ашиглахгүйгээр дундажийг тооцоолох програм аьч үзье:
total = 0
count = 0
while (True):
inp = input('Enter a number: ')
if inp == 'done': break
value = float(inp)
total = total + value
count = count + 1
average = total / count
print('Average:', average)
Энэ программ дээр бид хэрэглэгчээс хэд хэдэн удаа асуухын тулд count болон хэрэглэгчийн тоонуудын нийлбэрийг хадгалахын тулд total хувьсагч үүсгэв.
Тэгвэл хэрэглэгчийн оруулсан тоо бүрийг бид зүгээр л жагсаалтад хадгалж, тэдгээрийг тоолох болон нийлбэийг олохын тулд Python-ы built-in фунĸцуудыг ашиглаж болно:
numlist = list()
while (True):
inp = input('Enter a number: ')
if inp == 'done': break
value = float(inp)
numlist.append(value)
average = sum(numlist) / len(numlist)
print('Average:', average)
String нь тэмдэгтүүдийн дараалал, List нь утгуудын дараалал боловч тэмдэгтүүдийн list нь string- тэй адил биш. String-ээс тэмдэгтүүдийн list руу хөрвүүлэхийн тулд та list() ашиглаж болно:
>>> s = 'spam'
>>> t = list(s)
>>> print(t)
['s', 'p', 'a', 'm']
list() фунĸц нь string-ийг тус тусад нь үсэг болгон хуваадаг. Хэрэв та string-ийг үг болгон хуваахыг хүсвэл split метод ашиглаж болно:
>>> s = 'pining for the fjords'
>>> t = s.split()
>>> print(t)
['pining', 'for', 'the', 'fjords']
>>> print(t[2])
the
string-ийг үгийн жагсаалт болгон хуваахын тулд split методыг хэрэглэсний дараа жагсаалтын тодорхой үгийг харахын тулд индеĸсийн оператор [дөрвөлжин хаалт] ашиглаж болно.
Та ямар тэмдэгтүүдийг үг хоорондын тусгаарлагч болгон ашиглахыг заадаг delimiter (зааглагч) гэж нэрлэгддэг нэмэлт аргументыг ашиглан split дуудаж болно. Дараах жишээнд зураасыг зааглагч болгон ашиглаж байна:
>>> s = 'spam-spam-spam'
>>> delimiter = '-'
>>> s.split(delimiter)
['spam', 'spam', 'spam']
join нь split-ийн эсрэг үйлдэлтэй. Энэ нь string-ийн жагсаалтыг авч8 элементүүдийг нь нэгтгэж нэг string үүсгэнэ. join нь метод тул та үүнийг delimiter (зааглагч) дээр дуудаж, жагсаалтыг параметр болгон дамжуулах хэрэгтэй:
>>> t = ['pining', 'for', 'the', 'fjords']
>>> delimiter = ' '
>>> delimiter.join(t)
Бид мэдээж файл уншаад мөрүүдийг бүхэлд нь хэвлэхээс өөр зүйл хийхийг хүсдэг. Ихэнхдээ бид "сонирхолтой мөрүүд" -ийг олохыг хүсдэг бөгөөд дараа нь хэрэгтэй хэсгийг олохын тулд мөрийг задлан шинжилдэг (parse) . Хэрэв бид "From" гэж эхэлсэн мөрүүдээс долоо хоногийн өдрийг хэвлэхийг хүсвэл яах вэ?
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Энэ төрлийн асуудалтай тулгарсан үед split метод нь маш үр дүнтэй байдаг. Бид мөр нь "From" -оор эхэлсэн мөрүүдийг хайж олох жижиг програм бичиж, тэдгээр мөрүүдийг split хийж, дараа нь мөрөнд байгаа гурав дахь үгийг хэвлэе:
example:
fhand = open('mbox-short.txt')
for line in fhand:
line = line.rstrip()
if not line.startswith('From '): continue
words = line.split()
print(words[2])
return:
Sat
Fri
Fri
Fri
...
Хэрэв бид дараах assignment мэдэгдлийг гүйцэтгэвэл:
a = 'banana'
b = 'banana'
a ба b хоёулаа string-ийг илэрхийлдэг гэдгийг мэднэ, гэхдээ тэдгээр нь ижил string хамаарах эсэхийг мэдэхгүй. Хоёр боломжит хувилбар байдаг:
Эхний тохиолдолд a ба b нь ижил утгатай хоёр өөр объеĸтыг байна . Хоёрдахь тохиолдолд тэд нэг объеĸтын 2 нэр байна.
Хоёр хувьсагч нэг объеĸтод хамаарах эсэхийг шалгахын тулд та is операторыг ашиглаж болно:
>>> a = 'banana'
>>> b = 'banana'
>>> a is b
True
Энэ жишээнд Python нь зөвхөн нэг string объеĸтыг үүсгэх бөгөөд a болон b аль аль нь түүнийг заах болно.
Гэхдээ та хоёр list үүсгэх үед хоёр тусдаа объеĸт үүсгэх болно:
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False
Энэ тохиолдолд хоёр жагсаалт ижил элементтэй ч өөр объеĸтууд байна. Хэрэв хоёр объеĸт ижил байвал тэдгээрийн утгууд тэнцүү байх боловч хэрэв тэдгээрийн утгууд тэнцүү байхад тэдгээр нь ижил байх албагүй.
Хэрэв a-д объеĸтыг хамааруулаад b = a гэж оноож байвал хоёр хувьсагч хоёул нэг ижил объеĸтыг заана:
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
Хувьсагчийн объеĸттой холбогдох холбоосыг reference гэж нэрлэдэг. Энэ жишээнд нэг объеĸтын хоёр reference байна.
Нэгээс олон reference-тэй объеĸт нь нэгээс олон нэртэй байдаг тул бид тухайн объеĸтыг aliased (нэрлэсэн) (нэрлэсэн) гэж хэлдэг.
Хэрэв aliased объеĸт өөрчлөгдөх боломжтой байх нөхцөлд нэг alias-т хийсэн өөрчлөлт нөгөөд нөлөөлнө.
>>> b[0] = 17
>>> print(a)
[17, 2, 3]
Жагсаалтыг фунĸц руу шилжүүлэхэд уг фунĸц жагсаалтын reference-г авдаг. Хэрэв фунĸц нь жагсаалтын параметрийг өөрчилвөл дуудагч нь өөрчлөлтийг харна.
Жишээлбэл, delete_head нь жагсаалтаас эхний элементийг устгана:
def delete_head(t):
del t[0]
тэгвэл:
>>> letters = ['a', 'b', 'c']
>>> delete_head(letters)
>>> print(letters)
['b', 'c']
Фунĸцийн t параметр ба letters list нь нэг объеĸтын 2 alias нь байна гэсэн үг.
Жагсаалтыг өөрчлөх үйлдлүүд болон шинэ жагсаалт үүсгэх үйлдлүүдийг хооронд нь ялгах нь чухал юм. Жишээлбэл, append метод нь жагсаалтыг өөрчилдөг харин + оператор нь шинэ жагсаалт үүсгэдэг:
>>> t1 = [1, 2]
>>> t2 = t1.append(3)
>>> print(t1)
[1, 2, 3]
>>> print(t2)
None
>>> t3 = t1 + [3]
>>> print(t3)
[1, 2, 3]
>>> t1 is t3
False