Dữ liệu dạng List (danh sách) Dữ liệu dạng list trong Python là một trong những kiểu dữ liệu linh hoạt nhất cho phép lập trình viên làm việc với nhiều phần tử cùng một lúc 3.1.1. Khởi tạo danh sách trong Python Trong Python, một danh sách được tạo bằng cách đặt các phần tử bên trong cặp dấu ngoặc vuông và được ngăn cách nhau bởi dấu phẩy.
BÀI CẤU TRÚC DỮ LIỆU 3.1 Dữ liệu dạng List (danh sách) Dữ liệu dạng list Python kiểu liệu linh hoạt cho phép lập trình viên làm việc với nhiều phần tử lúc 3.1.1 Khởi tạo danh sách Python Trong Python, danh sách tạo cách đặt phần tử bên cặp dấu ngoặc vuông [ ] ngăn cách dấu phẩy Một danh sách có thể chứa phần tử thuộc nhiều kiểu liệu khác (số nguyên, số thực, chuỗi,…) Một danh sách chứa danh sách khác Trường hợp gọi danh sách lồng 3.1.2 Truy cập phần tử danh sách Có nhiều cách để truy cập phần tử danh sách: - Chỉ số danh sách: Chúng ta truy cập phần tử danh sách thơng qua số phần tử Trong Python, số danh sách Vì vậy, danh sách có phần tử có số phần từ từ đến Việc thực truy cập phần tử có số nằm ngồi số danh sách gây lỗi IndexError Chỉ số phải số nguyên, số số nguyên, chương trình trả lỗi TypeError Các phần tử danh sách lồng truy cập cách sử dụng số lồng - Chỉ số âm Python cho phép lập số âm cho phần tử danh sách Chỉ số -1 lấy phần tử cuối cùng, -2 lấy phần tử áp chót,… - Cắt danh sách Chúng ta liệu kê loạt phần tử liên tiếp danh sách cách sử dụng toán tử cắt Lưu ý: Khi sử dụng cắt danh sách, số bắt đầu bao gồm phần tử số đó, cịn số kết thúc không bao gồm phần tử ứng với số kết thúc Ví dụ: my_list[2:5] trả danh sách bao gồm phần tử số 2, 3, không bao gồm số 3.1.3 Thêm/Xóa phần tử Chúng ta sử đụng toán tử gán để thay đổi giá trị phần tử loạt phần tử liên tiếp Để thêm phần tử, sử dụng phương thức 𝑎𝑝𝑝𝑒𝑛𝑑(), phương thức 𝑒𝑥𝑡𝑒𝑛𝑑() để thêm nhiều phần tử danh sách Để nối danh sách, sử dụng tốn tử + Toán tử * nhân danh sách lên số lần định Ngồi ra, chèn vào vị trí danh sách phương thức insert() Hoặc chèn vào nhiều phần tử cách gán giá trị vào phần trống danh sách 3.1.4 Xóa phần tử danh sách Để xóa phần tử, nhiều phần tử toàn danh sách, ta sử dụng câu lệnh 𝑑𝑒𝑙 Python Ngồi ra, sử dụng phương thức remove() để loại bỏ phần tử 𝑝𝑜𝑝() để lấy phần tử số định Phương thức 𝑝𝑜𝑝() loại bỏ trả phần tử cuối số không truyền vào Phương thức khiến danh sách sử dụng ngăn xếp (FIFO) Nếu muốn làm trống tồn danh sách, sử dụng phương thức 𝑐𝑙𝑒𝑎𝑟() Cuối cùng, muốn xóa nhiều phần tử liên tiếp danh sách, ta gán chúng danh sách rỗng 3.1.5 Các phương thức danh sách Python Phương thức Chức append() Thêm phần tử vào cuối mảng extend() Thêm vào cuối mảng phần tử mảng khác insert() Thêm phần tử vào số xác định remove() Xóa phần tử khỏi mảng pop() Lấy phần tử cuối phần tử có số truyền vào mảng clear() Xóa tồn phần tử mảng index() Trả số phần tử tìm thấy count() Trả số lượng phần tử với đối số truyền vào sort() Sắp xếp mảng tăng dần reverse() Đảo ngược vị trí phần tử danh sách copy() Copy danh sách 3.2 Dữ liệu dạng Tuple Tuple (bộ giá trị) Python tương tự danh sách Sự khác biệt dạng liệu ta thay đổi phần tử tuple gán, thay đổi phần tử danh sách 3.2.1 Khởi tạo Tuple Một tuple khởi tạo cách đặt tất phần tử bên cặp dấu ngoặc đơn, ngăn cách dấu phẩy Dấu ngoặc đơn có khơng Một tuple có nhiều phần tử chúng thuộc kiểu liệu khác (số nguyên, float, danh sách, chuỗi,…) Một tuple tạo mà không cần sử dụng dấu ngoặc đơn Trường hợp cịn gọi đóng gói liệu Để tạo tuple chứa giá trị phần tử, cần thêm vào sau phần tử dấu phẩy 3.2.2 Truy cập phần tử Tuple Do tuple Python tương tự danh sách, nên cách truy cập phần tử tuple giống với cách truy cập phần tử danh sách - Sử dụng số Chúng ta sử dụng tốn tử [ ] để truy cập phần tử tuple, số Chỉ số phải số ngun, nên khơng thể sử dụng kiểu liệu khác để biểu diễn số tuple Tương tự danh sách, tuple lồng truy cập cách sử dụng số lồng - Chỉ số âm Python cho phép truy cập số âm tuple Chỉ số -1 đề cập đến phần tử cuối cùng, -2 phần tử áp chót,… - Cắt lát tuple Chúng ta truy cập loạt phần tử tuple cách sử dụng dấu hai chấm toán tử cắt 3.2.3 Thay đổi tuple Không giống danh sách, tuple bất biến Điều có nghĩa phần tử tuple thay đổi chúng gán Tuy nhiên, phần tử kiểu liệu thay đổi danh sách, phần tử lồng thay đổi Chúng ta sử dụng toán tử + để kết hợp tuple, hay gọi nối tuple Để lặp phần tử tuple, sử dụng toán tử * Khi sử dụng + hay *, tạo tuple 3.2.4 Xóa tuple Như nói trên, thay đổi phần tử tuple Nghĩa khơng thể xóa loại bỏ phần tử khỏi tuple Tuy nhiên, ta xóa hồn tồn tuple cách sử dụng từ khóa del việc xóa danh sách 3.2.5 Ưu điểm tuple so với danh sách Vì tuple giống với danh sách, nên hai sử dụng số tình tương tự Tuy nhiên, có số ưu điểm định việc sử dụng tuple sử dụng danh sách: - Chúng ta thường sử dụng tuple cho kiểu liệu không đồng sử dụng danh sách cho kiểu liệu đồng - Vì tuple bất biến nên việc lặp qua giá trị nhanh so với danh sách Do đó, hiệu suất cơng việc chút so với việc sử dụng danh sách - Các tuple chứa phần tử khơng thay đổi dùng làm từ khóa cho từ điển Với danh sách điều khơng thể - Nếu ta có liệu khơng thay đổi, việc lưu dạng tuple đảm bảo liệu chống ghi đè 3.3 Dữ liệu dạng Set Set tập hợp phần tử khơng có thứ tự Mọi phần tử set bị thay đổi Tuy nhiên, thân tập hợp thay đổi, thêm xóa phẩn tử khỏi tập hợp Các tập hợp Python sử dụng để thực phép toán tập hợp phép hợp, phép giao, lấy phần bù,… 3.3.1 Tạo tập hợp Một tập hợp khởi tạo cách đặt tất phần tử bên cặp dấu ngoặc nhọn {}, phân tách đấu phẩy; khởi tạo hàm set() Trong tập hợp, phần tử thuộc kiểu liệu khác (số nguyên, số thực, tuple, chuỗi,…) Tuy nhiên, tập hợp khơng thể chứa phần tử thay đổi danh sách, tập hợp khác hay liệu kiểu từ điển Nếu tạo tập hợp rỗng cặp dấu {} định nghĩa kiểu liệu dạng từ điển Do đó, để tạo tập hợp rỗng (khơng có phần tử nào), phải sử dụng hàm set() mà không truyền vào đối số # Các dạng khác tập hợp # Tập hợp số nguyên my_set = {1, 2, 3} # Tập hợp liệu hỗn hợp my_set = {1.0, "Python", (1, 2, 3)} 3.3.2 Sử đổi tập hợp Tập hợp thay đổi Tuy nhiên chúng khơng có thứ tự nên việc đánh số khơng có ý nghĩa Chúng ta khơng thể truy cập thay đổi phần tử tập hợp cách sử dụng số thực cắt tập hợp danh sách hay tuple Chúng ta thêm phần tử phương thức add() nhiều phần tử phương thức update() Phương thức update() truyền vào tuple, danh sách, chuỗi tập hợp khác để bổ sung vào tập hợp sử dụng phương thức Toàn phần tử trùng bị loại bỏ # Khởi tạo my_set my_set = {1, 3} # # # # my_set[0] Thực lệnh truy xuất phần tử set số gây lỗi TypeError: 'set' object does not support indexing # Thêm phần tử my_set.add(2) # {1, 2, 3} # Thêm nhiều phần tử my_set.update([2, 3, 4]) # {1, 2, 3, 4} # Thêm danh sách vào tập hợp my_set.update([4, 5], {1, 6, 8}) # {1, 2, 3, 4, 5, 6, 8} 3.3.3 Xóa phần tử khỏi tập hợp Có thể xóa phần tử cụ thể tập hợp cách sử dụng phương thức discard() remove() Hai phương thức khác việc discard() không trả lỗi phần tử khơng có mặt tập hợp, cịn remove() ngược lại, phần tử bị xóa khơng nằm tập hợp gây lỗi # Sự khác discard() remove() # Khởi tạo tập hợp my_set = {1, 3, 4, 5, 6} # Sử dụng discard() my_set.discard(4) # {1, 3, 5, 6} # Sử dụng remove() my_set.remove(6) # {1, 3, 5} # Xóa phần tử khơng có tập hợp discard() my_set.discard(2) # {1, 3, 5} # Xóa phần tử khơng có tập hợp remove() # gây lỗi my_set.remove(2) # Output: KeyError Ngồi ra, ta xóa trả lại phần tử tập hợp phương thức pop() Do tập hợp kiểu liệu khơng có thứ tự, khơng thể xác định phần tử xóa, nên việc xóa lấy phần tử pop() hoàn toàn ngẫu nhiên Ta xóa tất mục khỏi tập hợp phương thức clear() 3.3.4 Các thao tác tập hợp Các tập hợp Python thực phép toán giống với tập hợp toán học phép hợp, phép giao, phép trừ lấy phần bù - Phép hợp Phép giao A B trả kết tập hợp gồm phần tử tập hợp Trong Python, ta sử dụng tốn tử | phương thức union() để thực phép giao tập hợp # # A B Phép giao tập hợp Khởi tạo tập hợp A B = {1, 2, 3, 4, 5} = {4, 5, 6, 7, 8} # Sử dụng toán tử | print(A | B) # {1, 2, 3, 4, 5, 6, 7, 8} # Sử dụng phương thức union() A.union(B) # {1, 2, 3, 4, 5, 6, 7, 8} B.union(A) # {1, 2, 3, 4, 5, 6, 7, 8} - Phép giao tập hợp # # A B Phép giao tập hợp Khởi tạo tập hợp A B = {1, 2, 3, 4, 5} = {4, 5, 6, 7, 8} # Sử dụng toán tử & A & B # {4, 5} # Sử dụng phương thức intersection() A.intersection(B) # {4, 5} - Hiệu hai tập hợp # # A B Hiệu tập hợp Khởi tạo tập hợp A B = {1, 2, 3, 4, 5} = {4, 5, 6, 7, 8} # Sử dụng toán tử print(A - B) # {1, 2, 3} # Sử dụng phương thức difference A.difference(B) # {1, 2, 3} - Các phép kiểm tra Ta sử dụng isdisjoint() để kiểm tra xem hai tập hợp có rời hay khơng; issubset() kiểm tra xem tập hợp có tập tập khác; hay issuperset() dùng để kiểm tra tập hợp có tập mẹ tập khác hay không 3.4 Dữ liệu dạng Dictionary Dạng liệu Dictionary (Từ điển) Python tập hợp phần tử không theo thứ tự Mỗi phần tử từ điển có cặp key value Từ điển tối ưu hóa để truy xuất giá trị biết khóa 3.4.1 Khởi tạo từ điển Để tạo dictionary Python, ta đặt phần tử từ điển bên cặp dấu ngoặc nhọn {} phân cách dấu phẩy Một phần tử có cặp key:value tương ứng với khóa giá trị mà phần tử lưu trữ Dù cho giá trị kiểu liệu lặp lại, khóa phải thuộc kiểu liệu cố định (chuỗi, số, tuple với phần tử cố đinh,…) phải # Từ điển rỗng my_dict = {} # Từ điển với khóa số nguyên my_dict = {1: 'apple', 2: 'ball'} # Từ điển với khóa hỗn hợp my_dict = {'name': 'John', 1: [2, 4, 3]} # Sử dụng dict() để khởi tạo từ điển my_dict = dict({1:'apple', 2:'ball'}) # Có thể khai báo phần tử từ điển tuple chứa cặp key, value my_dict = dict([(1,'apple'), (2,'ball')]) 3.4.2 Truy cập phần tử từ điển Thay sử dụng số để truy cập vào phần tử từ điển sử dụng key để truy cập đến giá trị phần tử tương ứng Các khóa đặt dấu [] sử dụng phương thức get() để lấy giá trị tương ứng Nếu sử dụng [] trường hợp khơng tìm thấy khóa từ điển, chương trình trả lỗi Còn phương thức get() trả giá trị None khơng tìm giá trị tương ứng với khóa truyền vào my_dict = {'name': 'Nam', 'age': 26} print(my_dict['name']) # Nam print(my_dict.get('age')) # 26 print(my_dict.get('address')) # None print(my_dict['address']) # KeyError 3.4.3 Thay đổi bổ sung từ điển Từ điển thay đổi, ta thêm phần tử thay đổi giá trị phần tử tốn tử gán Nếu khóa có giá trị giá trị cập nhật Trong trường hợp khơng có khóa, cặp key:value thêm vào từ điển my_dict = {'name': 'Jack', 'age': 26} # Cập nhật giá trị my_dict['age'] = 27 # {'age': 27, 'name': 'Jack'} # Thêm phần tử my_dict['address'] = 'Downtown' # {'address': 'Downtown', 'age': 27, 'name': 'Jack'} 3.4.4 Xóa phần tử khỏi từ điển Ta xá phần tử cụ thể từ điển cách sử dụng pop() Phương thức loại bỏ phần tử với đối số truyền vào key trả lại giá trị value Phương thức popitem() sử dụng để loại bỏ trả cặp key, value từ từ điển Tất phần tử xóa ta sử dụng phương thức clear() Ngồi ra, ta sử dụng del để xóa phần tử tồn từ điển squares = {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} # Xóa phần tử theo key, trả giá trị print(squares.pop(4)) # 16 print(squares) # {1: 1, 2: 4, 3: 9, 5: 25} # Xóa phần tử bất kỳ, trả cặp (key, value) print(squares.popitem()) # (5, 25) print(squares) # {1: 1, 2: 4, 3: 9} # Xóa tồn phần tử squares.clear() print(squares) # {} # Xóa từ điển del squares print(squares) # Throws Error 3.4.5 Một số phương thức từ điển Python Phương thức Chức clear() Xóa tất phần tử từ điển copy() Trả từ điển fromkeys(seq[, v]) Trả từ điển với khóa lấy từ seq giá trị với v (mặc định None) get(key[,d]) Trả giá trị key truyền vào Nếu tồn key từ điển, trả d (mặc định None) items() Trả danh sách phần tử từ điển dạng (key, value) keys() Trả danh sách khóa từ điển pop(key[,d]) Loại bỏ phần tử tương ứng với key truyền vào Nếu khơng tìm thấy key, chương trình trả lỗi popitem() Loại bỏ trả phần tử từ điển Trả lỗi từ điển trống setdefault(key[,d]) Trả giá trị tương ứng key có từ điển Nếu khơng, bổ sung khóa với giá trị d trả lại d (mặc định None) update([other]) Cập nhật từ điển với cặp giá trị key:value từ từ điển khác, ghi đè khóa có values() Trả danh sách giá trị từ điển 3.5 Dữ liệu dạng String 3.5.1 Khái niệm String Python Một string (chuỗi) danh sách ký tự Trong Python, chuỗi danh sách ký tự bảng mã Unicode Bảng mã Unicode bao gồm ký tự tất ngôn ngữ mang lại đồng bảng mã 3.5.2 Khởi tạo chuỗi Python Các chuỗi tạo cách đặt ký tự bên cặp dấu nháy đơn nháy kép # Các cách khởi tạo chuỗi sau tương đương my_string = 'Hello' my_string = "Hello" my_string = '''Hello''' # Sử dụng dấu nháy kép để kéo dài chuỗi thành nhiều dòng my_string = """Hello, welcome to the world of Python""" 3.5.3 Truy cập ký tự chuỗi Ta truy cập ký tự riêng lẻ cách sử dụng số nhiều ký tự cách sử dụng phương thức cắt danh sách Chỉ số chuỗi Truy cập ký tự với số nằm độ dài chuỗi trả lỗi Chỉ số phải số nguyên, truy cập phần tử với số số nguyên trả lỗi Tương tự danh sách, ta sử dụng số âm để truy cập đến ký tự chuỗi 3.5.4 Thay đổi xóa chuỗi Các phần tử chuỗi thay đổi chúng gán Ta gán lại chuỗi khác vào biến chuỗi ban đầu Tương tự, ta khơng thể xóa loại bỏ ký tự khỏi chuỗi, xóa hồn tồn chuỗi từ khóa del - 3.5.5 Thao tác chuỗi Nối chuỗi str1 = 'Hello' str2 ='World!' # Sử dụng + print('str1 + str2 = ', str1 + str2) # Sử dụng * print('str1 * =', str1 * 3) - Duyệt ký tự chuỗi count = for letter in 'Hello World': if (letter == 'l'): count += print(count) # 3.5.6 Định dạng chuỗi Phương thức format() đối tượng chuỗi phương thức mạnh việc định dạng chuỗi # Thứ tự mặc định default_order = "{}, {} {}".format('Lan','Minh','Nam') print(default_order) # Lan, Minh Nam # Format dựa vào thứ tự đối số positional = "{1}, {0} {2}".format('Lan','Minh','Nam') print(positional) # Minh, Lan Nam # Format dựa vào từ khóa keyword = "{m}, {n} {l}".format(l='Lan',m='Minh',n='Nam') print(keyword) # Minh, Nam Lan Phương thức format() cho phép tùy chọn định dạng chuỗi Các tùy chọn phân tách với tên đối số hay từ khóa dấu hai chấm Ví dụ, ta trái ^ chuỗi khoảng chọn Ngồi ra, ta định dạng số nguyên dạng nhị phân, số 16,… số thực làm trịn hiển thị định dạng mũ >>> # Định dạng số nguyên >>> "Hệ nhị phân {0} biểu diễn {0:b}".format(12) 'Hệ nhị phân 12 biểu diễn 1100' >>> # Định dạng số thực >>> "Biểu diễn dạng số mũ: {0:e}".format(1566.345) 'Biểu diễn dạng số mũ: 1.566345e+03' >>> # Làm tròn số >>> "Một phần ba: {0:.3f}".format(1/3) 'Một phần ba: 0.333' >>> # Căn lề cho chuỗi >>> "|{:10}|".format('list','tuple','set') '|list | tuple | set|' 3.5.7 Một số phương thức xử lý chuỗi Có nhiều phương thức định nghĩa sẵn để xử lý chuỗi Python Một số phương thức thường sử dụng như: lower(), upper(), join(), split(), find(), replace(),… >>> "Python".lower() 'python' >>> "Python".upper() 'PYTHON' >>> "Tách chuỗi thành từ".split() ['Tách', 'chuỗi', 'thành', 'từ'] >>> ' '.join(['Ghép', 'từ', 'thành', 'chuỗi']) 'Ghép từ thành chuỗi' >>> 'Happy New Year'.find('ew') >>> 'Happy New Year'.replace('Happy','Hi') 'Hi New Year'