Kiểu set trong Python không có thứ tự
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 …