---
title: Virgil - Practice Python - S51 Dictionary Set
tags: Virgil, LearnWorld, PracticePython
---
# Dictionary and Set
## Dictionary
Dictionary là một cấu trúc dữ liệu liên kết **keys** và **values**. Dictionary được định nghĩa bới dấu ngoặc nhọn `{}`:
```python
numbers = {'one': 1, 'two': 2, 'three': 3}
print(numbers['one'])
numbers['eleven'] = 11
```
Trong ví dụ trên,
- `'one'`, `'two'`, `'three'` là keys và `1`, `2`, `3` là values
- Value của key `'one'` có thể được truy cập bằng `numbers['one']`. Cách truy xuất này khá giống list indexing, điểm khác là thay vì số thứ tự, bạn dùng key.
- Bạn có thể tạo một key mới với value mới như ở dòng lệnh `numbers['eleven'] = 11`. Tương tự như vậy bạn có thể thay đổi value của một key: `numbers['one'] = 'CoderSchool'`
- **Không có hai key trùng nhau trong một dictionary**
Bạn có thể duyệt qua các keys của một dictionary bằng vòng lặp `for`:
```python
for key in numbers:
print(key, numbers[key])
# Output:
# one 1
# two 2
# three 3
```
### Dictionary methods
Một vài methods thông dụng:
- Bạn có thể lấy danh sách các keys và values của một dictionary `d` bằng method `d.keys()` và `d.values()`:
```python
print(numbers.keys()) # Output: dict_keys(['one', 'two', 'three'])
print(numbers.values()) # Output: dict_values([1, 2, 3])
```
- Method `d.items()` rất hữu dụng khi bạn muốn duyệt qua cả keys và values trong một dictionary:
```python
for key, value in numbers.items():
print(key, value)
# Output
# one 1
# two 2
# three 3
```
## Set
Set trong Python là một tập hợp các phần tử không trùng nhau và không có sắp xếp thứ tự. Set cho phép thêm và xoá bớt phần tử nhưng không cho thay đổi chúng.
Set có thể được định nghĩa bằng dấu ngoặc nhọn `{}`:
```python
primes = {2, 3, 5, 7}
```
Hoặc
```python
primes = set([2, 3, 5, 7])
```
Chú ý tạo set giống dictionary ở dấu ngoặc nhọn nhưng không có các cặp keys, values mà chỉ có values.
Khi bạn tạo set từ một danh sách có các phần tử trùng nhau, chúng sẽ tự động được lọc ra:
```python
primes = {2, 2, 2, 3, 5, 7}
print(primes) # Output: {2, 3, 5, 7}
```
Bạn có thể tạo một set các ký tự bằng việc truyền một string vào function `set()`
```python
set_a = set('abcd')
print(set_a) # Output: {'a', 'b', 'c', 'd'}
```
Bạn không thể truy cập vào một phần tử trong set như list hay dictionary, nhưng bạn vẫn có thể duyệt qua tất cả các phần tử với vòng lặp `for`:
```python
basket = set(["apple", "mango", "banana", "grapes", "orange"])
for fruit in basket:
print(fruit, end=' ')
# Output: orange banana grapes apple mango
```
### Các phép toán với set
Set dùng để mô tả khái niệm tập hợp trong toán học, nên nó cũng có các phép toán như hợp (Union), giao (Intersection), hiệu (Difference), phần bù (Complement), quan hệ bao hàm, quan hệ bằng nhau.
[Minh hoạ lý thuyết tập hợp](<https://vi.wikipedia.org/wiki/T%E1%BA%ADp_h%E1%BB%A3p_(to%C3%A1n_h%E1%BB%8Dc)>)
```python
# Demonstrate set operations on unique letters from two words
set_a = set('abracadabra')
set_b = set('alacazam')
# unique letters in set_a
print(set_a) # Output: {'a', 'r', 'b', 'c', 'd'}
# letters in set_a but not in set_b (difference)
print(set_a - set_b) # Output: {'r', 'd', 'b'}
# letters in set_a or set_b or both (union)
print(set_a | set_b) # Output: {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
# letters in both set_a and set_b (intersection)
print(set_a & set_b) # Output: {'a', 'c'}
# letters in set_a or set_b but not both
print(set_a ^ set_b) # Output: {'r', 'd', 'b', 'm', 'z', 'l'}
```
## Nâng cao và mở rộng
- Tương tự **list comprehension**, bạn có thể tạo dictionary một cách ngắn gọn từ một list:
```python
planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
planet_to_word_length = {planet: len(planet) for planet in planets}
# planet_to_word_length:
# {'Mercury': 7,
# 'Venus': 5,
# 'Earth': 5,
# 'Mars': 4,
# 'Jupiter': 7,
# 'Saturn': 6,
# 'Uranus': 6,
# 'Neptune': 7}
```
Trong ví dụ trên, một dictionary `planet_to_word_length` được tạo ra với keys là các từ trong list `planets` và values là chiều dài (số ký tự) trong mỗi key.