Kiểu set trong Python không có thứ tự

Viet Hung Nguyen
PyMivn
Published in
2 min readMar 12, 2017
Python sets

Tại lớp PyFML, một học viên sau khi đọc docstring của kiểu dữ liệu set thấy:

In [1]: set? # dùng IPython
Init signature: set(self, /, *args, **kwargs)
Docstring:
set() -> new empty set object
set(iterable) -> new set object
Build an unordered collection of unique elements.
Type: type

Nhưng theo quan sát thì thấy set có vẻ có thứ tự:

In [2]: set([10,5,1,2,6])
Out[2]: {1, 2, 5, 6, 10}

Tại sao?

Trả lời

Nói về thứ tự: nếu 1 list là: [1,2,3,4], nó đang xếp theo thứ tự số học (numerical) tăng dần.
Thử với list string

In [8]: set([‘121’, ‘13’, ‘1’, ‘12’, ‘111’])
Out[8]: {‘1’, ‘111’, ‘12’, ‘121’, ‘13’}

thứ tự này gọi là thứ tự từ điển (lexicography) — mặc định khi sắp xếp string.

Vậy các set sau theo thứ tự gì?

>>> set([1,4,2,5,’ahhi’, ‘huhu’,’bhihi’])
set([1, 2, 4, 5, ‘bhihi’, ‘ahhi’, ‘huhu’])
>>> set([5, 2, 7, 2, 1, 88])
set([88, 1, 2, 5, 7])

số thì tăng mà chữ thì giảm hay đảo lộn, từ b->a->h, hoặc 88 rồi đến 1.

Cái được cho là thứ tự của set ở trên, thực ra nó không phải 1 tính chất mong đợi mà vô tình nó như vậy thôi và nó cũng sai khi thử với số 88 và 1. (Lý do xâu xa: kiểu set của Python được viết dựa trên kiểu hash table)
Kết luận: set là “unordered” — “không theo thứ tự” (https://en.oxforddictionaries.com/definition/unordered)
Chú ý là unordered chứ không phải RANDOM (ngẫu nhiên). Mình tạo 10 cái set giống nhau 10 lần nó sẽ ra kết quả giống hệt — tức không phải random.
Xem thêm: http://stackoverflow.com/questions/12165200/order-of-unordered-python-sets#12165239

Đăng ký học Python tại lớp PyFML (https://pymi.vn) để thành thạo Python sau 1.5 tháng. Khoá tiếp theo tại Hà Nội khai giảng giữa tháng 4/2017.

Nhập email vào http://invite.pymi.vn/ để nhận thư mời tham gia forum hỏi đáp Python, Django, Golang …

--

--