Trang

Friday, May 29, 2015

Bài 9: Cấu trúc dữ liệu trong Python

Hôm nay chúng ta sẽ cùng nhau đi tìm hiểu kĩ hơn 1 số kiểu dữ liệu trong Python, các phương thức của kiểu dữ liệu đó. Bài này, mình sử dụng shell Python để ví dụ nhé. Nào, chúng ta cùng vào bài học ngay bây h nhé.

1. Danh sách

Python có một số kiểu dữ liệu gộp, dùng để nhóm các giá trị với nhau. Kiểu linh hoạt nhất là danh sách (list), có thể được viết như là một danh sách các giá trị phân cách bởi dấu phẩy ở giữa ngoặc vuông.
Code:
a = ['ga', 'vit', 12, 1234]
Để tương tác với các giá trị của danh sách, chúng ta sử dụng các chỉ mục. Chỉ mục trong Python có giá trị bắt đầu là 0. Nó cũng giống với việc chúng ta sử dụng kiểu dữ liệu mảng của các ngôn ngữ lập trình như pascal, C ...

Code:
>>> a[0]
'ga'
>>>a[3]
1234
Với danh sách, chúng ta có thể cắt nhỏ, gộp các danh sách với nhau:

Code:
>>> a[1:-1] #Cat nho
['vit', 12]
>>> a[:2] + ['cho', 2*2] #Gop danh sach
['ga', 'vit', 'cho', 4]
>>> 3*a[:3] + ['Boo!']
['ga', 'vit', 12, 'ga', 'vit', 12, 'ga', 'vit', 12, 'Boo!']
Ngoài ra, chúng ta còn có thể thay đổi giá trị của danh sách:

Code:
>>> a
['ga', 'vit', 12, 1234]
>>> a[2] = a[2] + 111 # 12 + 111
>>> a
['ga', 'vit', 123, 1234]
Tiếp đến là thay đổi các kích thước của danh sách.

Code:
>>> # Thay the 1 vai muc:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Xoa bo 1 vai muc:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Chen them vao ds:
... a[1:1] = ['abc', 'abcd']
>>> a
[123, 'abc', 'abcd', 1234]
>>> # Nhan ban phan tu cua danh sach:
>>> a[:0] = a
>>> a
[123, 'abc', 'abcd', 1234, 123, 'abc', 'abcd', 1234]
>>> # Xoa bo cac phan tu cua danh sach (thay the cac phan tu do bang phan tu trong)
>>> a[:] = []
>>> a
[]
Lồng các danh sách vào nhau:
Code:
>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('abc')    #Xem o phan sau
>>> p
[1, [2, 3, 'abc'], 4]
>>> q
[2, 3, 'abc']
Phương thức của danh sách:
append( x)
Thêm một phần tử vào cuối danh sách; tương đương với a[len(a):] = [x].
extend( L)
Nới rộng danh sách bằng cách chèn vào tất cả các phần tử của danh sách chỉ định; tương đương với a[len(a):] = L.
insert( i, x)
Chèn một phần tử vào vị trí chỉ định. Thông số đầu là chỉ mục của phần tử sẽ bị đẩy lùi, cho nên a.insert(0, x) chèn vào đầu danh sách, và a.insert(len(a), x) tương đương với a.append(x).
remove( x)
Bỏ ra khỏi danh sách phần tử đầu tiên có giá trị là x. Sẽ có lỗi nếu không có phần tử như vậy.
pop( [a ])
Bỏ khỏi danh sách phần tử ở vị trí chỉ định, và trả về chính nó. Nếu không chỉ định vị trí, a.pop() bỏ và trả về phần tử cuối trong danh sách. (Ngoặc vuông xung quanh a trong khai báo hàm cho biết thông số đó là không bắt buộc, không có nghĩa là bạn cần gõ dấu ngoặc vuông ở vị trí đó.
index( x)
Trả về chỉ mục của phần tử trong danh sách mà có giá trị là x. Sẽ có lỗi nếu không có phần tử như vậy.
count( x)
Trả về số lần x xuất hiện trong danh sách.
sort( )
Sắp xếp các phần tử trong danh sách, ngay tại chỗ.
reverse( )
Đảo ngược thứ tự các phần tử trong danh sách, ngay tại chỗ.
Ví dụ:
Code:
>>> a = [22.25, 111, 111, 1, 1234.5]
>>> print a.count(111), a.count(22.25), a.count('x')
2 1 0
>>> a.insert(2, -1)
>>> a.append(111) #Chen vao 111 o cuoi danh sach
>>> a
[22.25, 111, -1, 111, 1, 1234.5, 111]
>>> a.index(111) #Xem chi muc cua 111
1
>>> a.remove(111) #Xoa bo phan tu mang gia tri 111 dau tien
>>> a
[22.25, -1, 111, 1, 1234.5, 111]
>>> a.reverse() #Dao nguoc danh sach
>>> a
[111, 1234.5, 1, 111, -1, 22.25]
>>> a.sort() #Sap xep
>>> a
[-1, 1, 22.25, 111, 111, 1234.5]
Từ những phương thức trên, không biết các bạn có thể hình dung được cách sử dụng linh hoạt danh sách như ngăn xếp hay hàng đợi không nhỉ? Nếu không, chúng ta sẽ xem thử ở phần 2 nhé.
2. Sử dụng danh sách như ngăn xếp
Các phương thức của danh sách làm cho nó rất dễ sử dụng như là ngăn xếp (stack), là nơi mà phần tử cuối được thêm vào là phần tử đầu được lấy ra (``vào sau, ra trước'' hay ``last-in, first-out''). Để thêm phần tử vào đỉnh của ngăn xếp, dùng append(). Để lấy một phần tử từ đỉnh của ngăn xếp, dùng pop() mà không chỉ định chỉ mục.
Ví dụ:
Code:
>>> stack = [1,2,3]
>>> stack.append(4)
>>> stack.append(5)
>>> stack
[1,2,3,4,5]
>>> stack.pop()
5
>>> stack
[1,2,3,4]
>>> stack.pop()
4
>>> stack.pop()
3
>>> stack
[1,2]
3. Sử dụng danh sách như hàng đợi.
Bạn cũng có thể thuận tiện dùng danh sách như là hàng đợi (queue), nơi mà phần tử được thêm vào đầu tiên là phần tử được lấy ra đầu tiên ("vào trước, ra trước'' hay "first-in, first-out''). Để thêm một phần tử vào cuối hàng đợi, dùng append(). Để lấy một phần tử từ đầu hàng đợi, dùng pop() với 0 là chỉ mục.
Code:
>>> queue = ["cho", "meo", "ga"]
>>> queue.append("trau")  
>>> queue.append("bo")
>>> queue.pop(0)
'cho'
>>> queue.pop(0)
'meo'
>>> queue
['ga', 'trau', 'bo']

Hôm nay chúng ta sẽ cùng nhau đi tìm hiểu tiếp 1 số kiểu dữ liệu trong Python, các phương thức của kiểu dữ liệu đó.

1. Tập hợp (set)
Một tập hợp là một nhóm các phần tử không trùng lặp. Tập hợp thường được sử dụng để loại bỏ các phần tử trùng lặp trong danh sách, hay là dùng để kiểm tra nhân viên, hội viên....

Cú pháp:
Code:
>>>a = ['a','b','a','d','c','d']
>>>taphop = set(a)
set(['a', 'c', 'b', 'd']) #nó đã bỏ đi các phần tử giống nhau
>>>'a' in taphop #kiểm tra xem a có phải phần tử của tập hợp không
True
Với kiểu dữ liệu tập hợp, chúng ta cũng có 4 toán tử tác động tới tập hợp: hợp, giao, hiệu, và hiệu đối xứng.

Code:
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # những kí tự có trong a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b                              # kí tự có trong a nhưng không có trong b
set(['r', 'd', 'b'])
>>> a | b                              # kí tự có ở a hoặc b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b                              # kí tự có cả ở a và b
set(['a', 'c'])
>>> a ^ b                              # kí tự có ở a hoặc b nhưng không có ở cả hai
set(['r', 'd', 'b', 'm', 'z', 'l'])
2. Từ điển
Các bạn đã sử dụng danh sách (list) không biết có liên tưởng đến việc thao tác với danh sách giống việc chúng ta tra 1 cuốn từ điển không nhỉ? Câu trả lời là việc thao tác với danh sách giống với việc thao tác với từ điển, điểm khác nhau là chỉ mục của danh sách là số, còn chỉ mục của từ điển là chuỗi (string). Python cung cấp cho chúng ta việc đặt các chỉ mục của danh sách bằng các chuỗi, từ đó chúng ta có thể tương tác với các phần tử của danh sách giống như việc sử dụng 1 cuốn từ điển.
Điểm quan trọng nhất các bạn cần nhớ là chỉ mục của từ điển được sử dụng là các khóa không đổi, tức là dữ liệu cố định: số, chuỗi..Nếu các bạn dùng danh sách làm khóa cho từ điển thì sẽ bị lỗi vì danh sách có thể tương tác trực tiếp với các phương thức của nó: append() hay pop()...
Cú pháp để tạo từ điển:
Code:
a = {khoa1:giatri1,khoa2:giatri2,...}
Ví dụ:
Code:
>>> a = {'dog':'cho','chicken':'ga','bird':'chim'}
>>> a
{'chicken': 'ga', 'dog': 'cho', 'bird': 'chim'}
>>> a['chicken'] #cách thao tác với 1 phần tử của từ điển
'ga'
Từ điển có 3 phương thức là keys(), sort(), has_key(): Phương thức keys() của đối tượng từ điển trả về một danh sách các khóa đã được dùng trong từ điển, theo một thứ tự bất kỳ (nếu bạn muốn chúng được sắp xếp, chỉ cần áp dụng phương thức sort() vào danh sách các khóa). Để kiểm tra xem một khóa có trong từ điển hay không, có thể dùng phương thức has_key() hoặc từ khóa in . Ngoài ra, để xóa 1 cặp khóa:giátrị bạn có thể sử dụng câu lệnh del(). Sau đây là 1 ví dụ nhỏ, cơ bản:
Code:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> tel.keys()
['guido', 'irv', 'jack']
>>> tel.has_key('guido')
True
>>> 'guido' in tel
True
Cuối cùng, để các bạn thực sự hiểu hết về từ điển, mời các bạn thử chương trình dưới đây. Mình mong muốn các bạn tự gõ code bằng tay, không paste nhé. Hay dùng comment để ghi vào chương trình dự đoán của bạn về các thông tin in ra màn hình:
Code:
states = {
'Oregon': 'OR',
'Florida': 'FL',
'California': 'CA',
'New York': 'NY',
'Michigan': 'MI'
}

cities = {
'CA': 'San Francisco',
'MI': 'Detroit',
'FL': 'Jacksonville'
}

cities['NY'] = 'New York'
cities['OR'] = 'Portland'# print out some cities
print '-' * 10
print "NY State has: ", cities['NY']
print "OR State has: ", cities['OR']

print '-' * 10
print "Michigan's abbreviation is: ", states['Michigan']
print "Florida's abbreviation is: ", states['Florida']

print '-' * 10
print "Michigan has: ", cities[states['Michigan']]
print "Florida has: ", cities[states['Florida']]

print '-' * 10
for state, abbrev in states.items():
    print "%s is abbreviated %s" % (state, abbrev)

print '-' * 10
for abbrev, city in cities.items():
    print "%s has the city %s" % (abbrev, city)

print '-' * 10
for state, abbrev in states.items():
    print "%s state is abbreviated %s and has city %s" % (state, abbrev, cities[abbrev])

print '-' * 10
state = states.get('Texas', None)
if not state:
    print "Sorry, no Texas."

city = cities.get('TX', 'Does Not Exist')
print "The city for the state 'TX' is: %s" % city
Bài học hôm nay kết thúc tại đây. Buổi sau mình sẽ đi giới thiệu về hàm trong Python nhé. Mời các bạn đón đọc.

1 comment:

  1. state = states.get('Texas', None): dò trong từ điển states xem có Texas hay ko. Nếu ko có trả về giá trị None cho state
    if not state: nếu state == none
    city = cities.get('TX', 'Does Not Exist'): dò trong từ điển cities xem có trường TX ko. Nếu ko có trả về Does Not Exist.

    ReplyDelete