Làm quen với 4 kiểu dữ liệu collection trong Python

Post Reply
boco.cf
Posts: 13
Joined: Wed Apr 17, 2019 1:29 pm

Làm quen với 4 kiểu dữ liệu collection trong Python

Post by boco.cf »

There are four collection data types in the Python programming language:
  • List is a collection which is ordered and changeable. Allows duplicate members.
  • Tuple is a collection which is ordered and unchangeable. Allows duplicate members.
  • Set is a collection which is unordered and unindexed. No duplicate members.
  • Dictionary is a collection which is unordered, changeable and indexed. No duplicate members.
Để thực hành các lệnh python bên dưới, bạn sử dụng colab: https://colab.research.google.com/
Login bằng tài khoản gmail của bạn là ok, trên colab có đầy đủ môi trường cho bạn code python thoải cmn mái.
1. Tuples

Trong Python, có các kiểu dữ liệu khác nhau: string, integer và float. Tất cả các loại dữ liệu có thể được chứa trong tuple như sau:

Image

tuple1=("disco",10,1.2 )

Mỗi phần tử của một tuple có thể được truy cập thông qua một chỉ mục.

Image

Code: Select all

print( tuple1[0])
print( tuple1[1])
print( tuple1[2])
--------------------
disco
10
1.2
Chúng ta cũng có thể sử dụng chỉ mục âm:

Image

Chúng ta có thể nối hoặc kết hợp các bộ dữ liệu bằng cách sử dụng dấu cộng "+":

Code: Select all

tuple2=tuple1+("hard rock", 10)
tuple2
--------------------
('disco', 10, 1.2, 'hard rock', 10)
Chúng ta có thể slice tuple để có thể thu được các tuple con sau:

Image

Code: Select all

tuple2[0:3]
--------------------
('disco', 10, 1.2)

tuple2[3:5]
--------------------
('hard rock', 10)

len(tuple2)
--------------------
5
Xem xét một ví dụ khác: ta có 1 tuple Ratings =(0,9,6,5,10,8,9,6,2)

Có thể gán tuple này cho tuple thứ 2 như sau:

Code: Select all

# cả 2 tuple cùng trỏ vào 1 địa chỉ nên nội dung sẽ là một
Ratings1=Ratings
Ratings
--------------------
(0, 9, 6, 5, 10, 8, 9, 6, 2)

Ratings1
--------------------
(0, 9, 6, 5, 10, 8, 9, 6, 2)
Kết quả là cả 2 tuple đều có cùng một giá trị như nhau.

Ta có thể sorted 1 tuple và lưu nó vào một tuple mới:

Code: Select all

RatingsSorted=sorted(Ratings )
RatingsSorted
--------------------
[0, 2, 5, 6, 6, 8, 9, 9, 10]
Tuple là immutable (không thay đổi)

Ở câu lệnh trên ta đã gán cho RatingsSorted một tập các số nguyên đã sắp xếp tăng, nhưng bản thân tuple Ratings vẫn giữ nguyên. Ta cũng không thể sửa đổi giá trị của các phần tử trong tuple bằng câu lệnh sau: Ratings[0] = 4, vì tuple là không thay đổi được.

Xem xét lệnh sau:

Code: Select all

# Bạn chỉ có thể trỏ tuple đến 1 bộ nhớ khác, 
# nhưng ghi đè các phần tử của nó thì không thể được.
Ratings = (1, 2, 3)
Ratings
--------------------
(1, 2, 3)

# Ratings1 được trỏ tới cùng ô nhớ của Ratings ở lệnh bên trên nên vẫn giữ nguyên giá trị
Ratings1
--------------------
(0, 9, 6, 5, 10, 8, 9, 6, 2)
Một tuple có thể chứa một tuple khác cũng như các kiểu dữ liệu phức tạp khác. Quá trình này được gọi là "lồng". Hãy xem xét tuple sau với các phần tử:

Code: Select all

NestedT =(1, 2, ("pop", "rock") ,(3,4),("disco",(1,2)))

print("Element 0 of Tuple: ",   NestedT[0])
print("Element 1 of Tuple: ",  NestedT[1])
print("Element 2 of Tuple: ",  NestedT[2])
print("Element 3 of Tuple: ", NestedT[3])
print("Element 4 of Tuple: ", NestedT[4])
--------------------
Element 0 of Tuple:  1
Element 1 of Tuple:  2
Element 2 of Tuple:  ('pop', 'rock')
Element 3 of Tuple:  (3, 4)
Element 4 of Tuple:  ('disco', (1, 2))
Chúng ta có thể sử dụng chỉ mục thứ hai để truy cập các bộ dữ liệu khác như được minh họa trong hình:

Image

Code: Select all

print("Element 2,0 of Tuple: ",   NestedT[2][0])
print("Element 2,1 of Tuple: ",   NestedT[2][1])
print("Element 3,0 of Tuple: ",   NestedT[3][0])
print("Element 3,1 of Tuple: ",   NestedT[3][1])
print("Element 4,0 of Tuple: ",   NestedT[4][0])
print("Element 4,1 of Tuple: ",   NestedT[4][1])
--------------------
Element 2,0 of Tuple:  pop
Element 2,1 of Tuple:  rock
Element 3,0 of Tuple:  3
Element 3,1 of Tuple:  4
Element 4,0 of Tuple:  disco
Element 4,1 of Tuple:  (1, 2)
Thậm chí có thể truy cập các string trong tuple lồng mức thứ 2 bằng cách sử dụng chỉ mục thứ 3:

Code: Select all

NestedT[2][1][0]
--------------------
'r'

NestedT[2][1][1]
--------------------
'o'
Tương tự, ta có thể truy cập các phần tử được lồng sâu hơn trong cây với chỉ mục thứ tư:

Code: Select all

NestedT[4][1][0]
--------------------
1

NestedT[4][1][1]
--------------------
2
Donate:
DGB address: D5SDMcJX6r1cJoPjWUfRj5BSfM2Y4Qvnzr

boco.cf
Posts: 13
Joined: Wed Apr 17, 2019 1:29 pm

List trong Python

Post by boco.cf »

2. List

Chúng ta sẽ xem xét các danh sách trong Python. Danh sách là một tập hợp tuần tự của các đối tượng khác nhau, chẳng hạn như số nguyên, chuỗi và các danh sách khác. Địa chỉ của từng thành phần trong danh sách được gọi là 'chỉ mục' (index). Một chỉ mục được sử dụng để truy cập và refer đến các phần tử trong danh sách.

Image

Code: Select all

L=["Michael Jackson" , 10.1,1982]
L
--------------------
['Michael Jackson', 10.1, 1982]
Ta có thể sử dụng chỉ mục âm (tương tự tuple)

Image

Code: Select all

print('the same element using negative and positive indexing:\n Postive:',L[0],
'\n Negative:' , L[-3]  )
print('the same element using negative and positive indexing:\n Postive:',L[1],
'\n Negative:' , L[-2]  )
print('the same element using negative and positive indexing:\n Postive:',L[2],
'\n Negative:' , L[-1]  )
--------------------
the same element using negative and positive indexing:
 Postive: Michael Jackson 
 Negative: Michael Jackson
the same element using negative and positive indexing:
 Postive: 10.1 
 Negative: 10.1
the same element using negative and positive indexing:
 Postive: 1982 
 Negative: 1982
Danh sách có thể chứa chuỗi, số float và số nguyên. Chúng ta có thể lồng các List khác và chúng ta cũng có thể lồng tuple và các cấu trúc dữ liệu khác. Các quy ước về chỉ mục tương tự áp dụng cho List lồng nhau:

[ "Michael Jackson", 10.1,1982,[1,2],("A",1) ]

Chúng ta cũng có thể thực hiện slicing trong list tương tự như với tuple.

Code: Select all

L=[ "Michael Jackson", 10.1,1982,"MJ",1]
L
--------------------
['Michael Jackson', 10.1, 1982, 'MJ', 1]

# thực hiện slice các phần tử ở chỉ mục 3,4
L[3:5]
--------------------
['MJ', 1]
Chúng ta có thể sử dụng phương thức "extend" để thêm các phần tử mới vào danh sách (cụ thể là thêm hai phần tử mới vào danh sách):

Code: Select all

L=[ "Michael Jackson", 10.2]
L.extend(['pop',10])
L
--------------------
['Michael Jackson', 10.2, 'pop', 10]
Một phương thức tương tự khác là append, khác với extend, append sẽ thêm 1 phần tử vào danh sách:

Code: Select all

L=[ "Michael Jackson", 10.2]
L.append(['pop',10])
L
--------------------
['Michael Jackson', 10.2, ['pop', 10]]
[/code

[size=150]Lists are mutable (có thể thay đổi)[/size]

[code]
A=["disco",10,1.2]
print('Before change:', A)
A[0]='hard rock'
print('After change:', A)
--------------------
Before change: ['disco', 10, 1.2]
After change: ['hard rock', 10, 1.2]
Xóa một phần tử trong list bằng lệnh del:

Code: Select all

print('Before change:', A)
del(A[0])
print('After change:', A)
--------------------
Before change: ['hard rock', 10, 1.2]
After change: [10, 1.2]
Method split

Code: Select all

'hard rock'.split()
--------------------
['hard', 'rock']

'A,B,C,D'.split(',')
--------------------
['A', 'B', 'C', 'D']
Khi chúng ta gán một biến B bằng A; cả A và B đều tham chiếu cùng một danh sách trong bộ nhớ:

Code: Select all

A=["hard rock",10,1.2]
B=A
print('A:',A)
print('B:',B)
--------------------
A: ['hard rock', 10, 1.2]
B: ['hard rock', 10, 1.2]
Image

Bạn có thể sao chép danh sách A bằng cách sử dụng cú pháp B=A[:]

Code: Select all

B=A[:]
B
--------------------
['hard rock', 10, 1.2]
Bây giờ ta thay đổi A, B sẽ không thay đổi:

Code: Select all

print('B[0]:',B[0])
A[0]="banana"
print('A[0]:',A[0])
print('B[0]:',B[0])
--------------------
B[0]: hard rock
A[0]: banana
B[0]: hard rock
Donate:
DGB address: D5SDMcJX6r1cJoPjWUfRj5BSfM2Y4Qvnzr

boco.cf
Posts: 13
Joined: Wed Apr 17, 2019 1:29 pm

Dictionaries trong Python

Post by boco.cf »

3. Dictionary

Một từ điển bao gồm các key và value. So sánh một từ điển với một danh sách: Thay vì sử dụng các chỉ mục như danh sách, từ điển có khóa. Các khóa này là các nhãn được sử dụng để truy cập các giá trị trong từ điển.

Image

Một ví dụ về Dictionary:

Code: Select all

Dict={"key1":1,"key2":"2","key3":[3,3,3],"key4":(4,4,4),('key5'):5,(0,1):6}
Dict
---------------------------
{(0, 1): 6,
 'key1': 1,
 'key2': '2',
 'key3': [3, 3, 3],
 'key4': (4, 4, 4),
 'key5': 5}
Khóa có thể là string: Dict["key1"]

Khóa cũng có thể là 1 đối tượng bất biến nào như tuple chẳng hạn: Dict[(0,1)]

Mỗi khóa được phân tách với giá trị của nó bằng dấu hai chấm ":". Dấu phẩy phân tách các phần tử và toàn bộ từ điển được đặt trong dấu ngoặc nhọn. Một từ điển trống không có bất kỳ mục nào được viết chỉ bằng hai dấu ngoặc nhọn, như "{}" này.

Code: Select all

release_year_dict = {"Thriller":"1982", "Back in Black":"1980", \
                    "The Dark Side of the Moon":"1973", "The Bodyguard":"1992", \
                    "Bat Out of Hell":"1977", "Their Greatest Hits (1971-1975)":"1976", \
                    "Saturday Night Fever":"1977", "Rumours":"1977"}
release_year_dict
---------------------------
{'Back in Black': '1980',
 'Bat Out of Hell': '1977',
 'Rumours': '1977',
 'Saturday Night Fever': '1977',
 'The Bodyguard': '1992',
 'The Dark Side of the Moon': '1973',
 'Their Greatest Hits (1971-1975)': '1976',
 'Thriller': '1982'}
Trực quan hóa từ điển dưới dạng bảng: Cột đầu tiên đại diện cho các khóa, cột thứ hai đại diện cho các giá trị.

Image

Tóm lại, giống như một danh sách, một từ điển chứa một chuỗi các phần tử. Mỗi phần tử được đại diện bởi một khóa và giá trị tương ứng của nó. Từ điển được tạo ra với hai dấu ngoặc nhọn chứa các khóa và giá trị được phân tách bằng dấu hai chấm. Đối với mỗi khóa, chỉ có thể có một giá trị duy nhất, tuy nhiên, nhiều khóa có thể giữ cùng một giá trị. Khóa chỉ có thể là strings, numbers, hoặc tuples, nhưng giá trị có thể là bất kỳ loại dữ liệu nào.

Xem xét ví dụ sau:

Code: Select all

soundtrack_dic = { "The Bodyguard":"1992", "Saturday Night Fever":"1977"}
soundtrack_dic 
---------------------------
{'Saturday Night Fever': '1977', 'The Bodyguard': '1992'}
Để truy cập các keys của từ điển, ta dùng key()

Code: Select all

soundtrack_dic.keys()
---------------------------
dict_keys(['The Bodyguard', 'Saturday Night Fever'])
Tương tự, truy cập danh sách các values:

Code: Select all

release_year_dict.values()
---------------------------
dict_values(['1982', '1980', '1973', '1992', '1977', '1976', '1977', '1977'])
Ta có thể thêm 1 phần tử:

Code: Select all

release_year_dict['Graduation']='2007'
release_year_dict
---------------------------
{'Back in Black': '1980',
 'Bat Out of Hell': '1977',
 'Graduation': '2007',
 'Rumours': '1977',
 'Saturday Night Fever': '1977',
 'The Bodyguard': '1992',
 'The Dark Side of the Moon': '1973',
 'Their Greatest Hits (1971-1975)': '1976',
 'Thriller': '1982'}
Có thể xóa 1 phần tử:

Code: Select all

del(release_year_dict['Thriller'])
del(release_year_dict['Graduation'])
release_year_dict
---------------------------
{'Back in Black': '1980',
 'Bat Out of Hell': '1977',
 'Rumours': '1977',
 'Saturday Night Fever': '1977',
 'The Bodyguard': '1992',
 'The Dark Side of the Moon': '1973',
 'Their Greatest Hits (1971-1975)': '1976'}
Có thể kiểm tra 1 phần tử có trong từ điển hay không:

Code: Select all

'The Bodyguard' in release_year_dict
---------------------------
True
Donate:
DGB address: D5SDMcJX6r1cJoPjWUfRj5BSfM2Y4Qvnzr

boco.cf
Posts: 13
Joined: Wed Apr 17, 2019 1:29 pm

Sets trong Python

Post by boco.cf »

4. Sets

Set là một tập hợp các đối tượng duy nhất trong Python. Bạn có thể biểu thị một tập hợp với dấu ngoặc nhọn {}. Python sẽ xóa các mục trùng lặp:

Code: Select all

set1={"pop", "rock", "soul", "hard rock", "rock", "R&B", "rock", "disco"}
set1
---------------------
{'R&B', 'disco', 'hard rock', 'pop', 'rock', 'soul'}
Bạn có thể tạo một tập hợp từ một danh sách:

Code: Select all

album_list =[ "Michael Jackson", "Thriller", 1982, "00:42:19", "Pop, Rock, R&B", 46.0, 65, "30-Nov-82", None, 10.0]

album_set = set(album_list)             
album_set
---------------------
{'00:42:19',
 10.0,
 1982,
 '30-Nov-82',
 46.0,
 65,
 'Michael Jackson',
 None,
 'Pop, Rock, R&B',
 'Thriller'}
Xem xét list A=[1,2,2,1] và tập hợp B=set([1,2,2,1]), liệu sum(A) = sum(B) hay không?

Code: Select all

A=[1,2,2,1]
B=set([1,2,2,1])
sum(A)==sum(B)
---------------------
False
Các toán tử :

Xem xét tập A = set(["Thriller","Back in Black", "AC/DC"] )

Add một phần tử:

Code: Select all

A.add("NSYNC")
A
---------------------
{'AC/DC', 'Back in Black', 'NSYNC', 'Thriller'}
Remove một phần tử:

Code: Select all

A.remove("AC/DC")
A
---------------------
{'Back in Black', 'NSYNC', 'Thriller'}
Kiểm tra 1 phần tử có trong Set ?

Code: Select all

"AC/DC"  in A
---------------------
False
Đối với Sets, ta có thể kiểm tra sự khác biệt giữa các sets, cũng như giao / hợp giữa các sets.

Xem xét ví dụ sau:

Code: Select all

album_set1 = set(["Thriller",'AC/DC', 'Back in Black'] )
album_set2 = set([ "AC/DC","Back in Black", "The Dark Side of the Moon"] )
album_set1, album_set2
---------------------
({'AC/DC', 'Back in Black', 'Thriller'},
 {'AC/DC', 'Back in Black', 'The Dark Side of the Moon'})
Image

Các phần tử chung giữa 2 tập hợp, còn gọi là intersection:

Code: Select all

album_set_3=album_set1 & album_set2
album_set_3
---------------------
{'AC/DC', 'Back in Black'}

album_set1.intersection(album_set2)
---------------------
{'AC/DC', 'Back in Black'}
Image

Sai khác giữa các Sets (difference)
- tìm phần tử chỉ chứa trong album_set1: album_set1.difference(album_set2)

Image

- tìm phần tử chỉ chứa trong album_set2: album_set2.difference(album_set1)

Image

Hợp giữa các Sets (union):

Code: Select all

album_set1.union(album_set2)
---------------------
{'AC/DC', 'Back in Black', 'The Dark Side of the Moon', 'Thriller'}
Có thể check 1 tập hợp có là tập cha / tập con của 1 tập hợp khác?

Code: Select all

set(album_set1).issuperset(album_set2)  => False

set(album_set2).issubset(album_set1) => False

set({"Back in Black", "AC/DC"}).issubset(album_set1) => True

album_set1.issuperset({"Back in Black", "AC/DC"}) => True

album_set3 = album_set1.union(album_set2) #Tạo tập hợp album_set3 là hợp của set1 và set2
album_set1.issubset(album_set3) => True
Donate:
DGB address: D5SDMcJX6r1cJoPjWUfRj5BSfM2Y4Qvnzr

Post Reply