Tư duy Tính toán

Iterables & Sets

Trường ĐH Công nghệ – Đại học Quốc gia Hà Nội

Nội dung

  1. Iterables: vì sao for chạy với dict?
  2. Sets: kiểu dữ liệu tập hợp

1.
Iterables

Vòng for trên dict

Cú pháp


for <var> in <dict>:
    <câu lệnh>
    ...
                

Ví dụ


for key in dct:
    print(key)
    print(dct[key])
                

Thực thi (đơn giản hoá):

  • Gán giá trị của key đầu tiên cho <var>. Thực thi các câu lệnh trong vòng lặp.
  • Gán giá trị của key thứ hai cho <var>. Thực thi các câu lệnh trong vòng lặp.
  • ...
  • Gán giá trị của key cuối cùng cho <var>. Thực thi các câu lệnh trong vòng lặp.

Vì sao for chạy với dict?

  • Trước đây ta lặp qua sequence (có chỉ số); dict thì không có chỉ số số nguyên.
  • Nhưng for làm việc với mọi iterable, không chỉ sequence.

Ta có thể lặp qua những gì?

  • Sequence: có len() & indexing (biết trước số phần tử, truy cập ngẫu nhiên).
  • Iterable: hỗ trợ iter() trả về iterator.
  • Iterator: có toán tử next(); không biết trước kích thước, không “nhảy cóc”.

List là iterable


>>> lst = [1, 2]
>>> lst_iterator = iter(lst)
>>> next(lst_iterator)
1
>>> next(lst_iterator)
2
>>> next(lst_iterator)
StopIteration
          

Dictionary cũng là iterable

Lặp trả về key theo thứ tự chèn (Python ≥ 3.7).


>>> dct = {'b': 2, 'a': 1}
>>> d_iterator = iter(dct)
>>> next(d_iterator)
'b'
>>> next(d_iterator)
'a'
>>> next(d_iterator)
StopIteration
          

Thực thi của vòng lặp for


for x in it:
    body
          
it có còn phần tử? Đúng Sai gán phần tử tiếp theo cho x thực thi thân vòng lặp

Dict: Trả về iterable

  • d.keys(): iterable của keys
  • Muốn danh sách? list(d.keys())
  • Lặp qua key:
    
    for key in d:         # khuyến nghị
        ...
    # hoặc (không cần thiết)
    for key in d.keys():
        ...
                  

Dict: Trả về iterable

  • d.values(): iterable của values
  • Muốn danh sách? list(d.values())
  • Lặp qua value:
    
    for val in d.values():
        ...
    # hoặc qua key
    for key in d:
        val = d[key]
        ...
                  

Dict: Trả về iterable

  • d.items(): iterable của các (key, value) (tuple)

for (key, val) in d.items():
    # xử lý với cả key và value
    ...
          

In biểu đồ đếm ký tự


def print_counts(counts):
    """In biểu đồ ngang cho dict 'counts' ánh xạ ký tự -> số lần."""
    for char in counts:
        count = counts[char]
        print(char + ' ' + '*' * count)
          

>>> print_counts({'a': 2, 'b': 2, '!': 1})
a **
b **
! *
          

2.
Sets

Set là gì?

  • Tập hợp các phần tử không thứ tự, không trùng.
  • Hỗ trợ toán tử in (kiểm tra thuộc).
  • Giống list nhưng không có vị trí/lặp lại
  • Giống dict nhưng chỉ có “khóa”.

Thao tác cơ bản với set


>>> s = {1, 2, 3}
>>> 1 in s
True
>>> 0 in s
False
>>> s.add(0); s
{0, 1, 2, 3}
>>> s.add(1); s     # thêm trùng bị bỏ qua
{0, 1, 2, 3}
>>> s.remove(0); s
{1, 2, 3}
          

Dấu ngoặc nhọn { } (giống dict và toán học).

In các phần tử của set

Set cũng là iterable:


def print_set(s):
    for item in s:
        print(item)
          

Ký tự duy nhất trong chuỗi


def uniq_chars(s):
    """Trả về set chứa các ký tự duy nhất của chuỗi s."""
    uniq = set()  # tạo set rỗng
    for char in s:
        uniq.add(char)
    return uniq
          

>>> uniq_chars('couscous')
{'o', 'u', 's', 'c'}
          

Hàm dựng set()

  • Tạo set từ bất kỳ sequence nào.

>>> # cách ngắn gọn hơn cho ví dụ trước
>>> set('couscous')
{'o', 'u', 's', 'c'}
>>> set([1, 1, 2, 3])
{1, 2, 3}
          

List vs Dict vs Set

List Dictionary Set
Cú pháp [ ] {key: value} {item, ...} hoặc set()
Thứ tự ✅ Có ⚠️ Theo thứ tự chèn ❌ Không
Trùng lặp ✅ Cho phép ❌ Key duy nhất ❌ Không
Truy cập Chỉ số Khoá Chỉ kiểm tra thuộc (in)
Dùng khi Danh sách có thứ tự Bảng tra cứu key → value Loại bỏ trùng, kiểm tra thuộc nhanh

Tổng kết

  • Iterable là bất kỳ kiểu cho phép tạo iterator bằng iter().
  • Dict có thể lặp qua vì nó iterable; các phương thức keys/values/items trả về iterables.
  • Set: tập hợp không thứ tự, không trùng; hữu ích để loại bỏ trùng lặp và kiểm tra thuộc.