2010-08-04 34 views
17

Nếu tôi có hai bộ giống nhau, nghĩa là a == b cho tôi True, chúng sẽ có cùng thứ tự lặp lại không? Tôi đã thử nó và hoạt động:Thứ tự lặp lại của các bộ trong Python

>>> foo = set("abc") 
>>> bar = set("abc") 
>>> zip(foo, bar) 
[('a', 'a'), ('c', 'c'), ('b', 'b')] 

Câu hỏi của tôi là, tôi may mắn, hoặc hành vi này có được đảm bảo không?

+0

Nếu 'a là b' tôi nghĩ họ sẽ có trình tự lặp lại tương tự. Sau đó, một lần nữa, đó không phải là một điểm rất tinh tế = p – katrielalex

Trả lời

21

Nó không phải là chỉ trùng hợp ngẫu nhiên là chúng xuất hiện giống nhau: việc triển khai diễn ra là xác định, vì vậy việc tạo cùng một bộ hai lần tạo ra cùng một thứ tự. Nhưng Python không đảm bảo điều đó.

Nếu bạn tạo cùng một trong hai cách khác nhau:

n = set("abc") 
print n 

m = set("kabc") 
m.remove("k") 
print m 

... bạn có thể nhận đặt hàng khác nhau:

set(['a', 'c', 'b']) 
set(['a', 'b', 'c']) 
+0

+1 Ví dụ đơn giản nhất. – katrielalex

+0

Một ví dụ khác rất tốt. Cảm ơn! –

+0

Bạn hoàn toàn đúng: nó không phải là một sự trùng hợp ngẫu nhiên. Ví dụ, có vẻ như nếu bạn tạo cùng một tập hợp trực tiếp mà không xóa bất kỳ thứ gì, bạn luôn nhận được cùng một thứ tự: Ví dụ: set ("abbacca") cung cấp tập hợp ('a', 'c', 'b') như được thiết lập ("bbabbca"). Hành vi này không ngẫu nhiên và được liên kết với việc triển khai. Nó sẽ là thú vị để nhìn vào mã nguồn của python :) (Nhưng trong mọi trường hợp nó chắc chắn sẽ là một ý tưởng tồi để dựa vào nó :)) – ThR37

4

Bạn đã may mắn, đơn đặt hàng không được bảo đảm. Điều duy nhất được đảm bảo là các bộ sẽ có cùng các yếu tố.

Nếu bạn cần một số loại dự đoán, bạn có thể sắp xếp chúng như sau: zip(sorted(foo), sorted(bar)).

0

Tôi muốn nói bạn đã may mắn. Mặc dù, nó cũng có thể là vì các phần tử trong tập hợp giống nhau, chúng được lưu trữ theo thứ tự như nhau. Hành vi này không phải là thứ bạn muốn dựa vào.

4

No .:

>>> class MyStr(str): 
...  def __hash__(self): 
...    return 0 
... 
>>> a = MyStr("a") 
>>> b = MyStr("b") 
>>> c = MyStr("c") 
>>> foo = { a, b, c } 
>>> foo 
{'c', 'b', 'a'} 
>>> bar = { b, a, c } 
>>> foo is bar 
False 
>>> foo == bar 
True 
>>> list(zip(foo, bar)) 
[('c', 'c'), ('b', 'a'), ('a', 'b')] 

T.B. Tôi không biết liệu ghi đè __hash__ là cần thiết hay không. Tôi chỉ cố gắng một cái gì đó tôi nghĩ sẽ phá vỡ này, và nó đã làm.

+0

Vâng, nó chứng minh quan điểm mặc dù. Nếu có sự va chạm băm, thứ tự có lẽ sẽ phụ thuộc vào thứ gì đó ngoài tầm kiểm soát của tôi. Cảm ơn! –

1

Vâng, bạn đã may mắn. Xem ví dụ:

import random 
r = [random.randint(1,10000) for i in range(20)] 
foo = set(r) 
r.sort(key=lambda _: random.randint(1,10000)) 
bar = set(r) 
print foo==bar 
print zip(foo, bar) 

nào đã cho tôi kết quả:

True 
[(3234, 3234), (9393, 9393), (9361, 1097), (1097, 5994), (5994, 2044), (1614, 1614), (6074, 4377), (4377, 9361), (5202, 5202), (2355, 2355), (1012, 1012), (7349, 7349), (6198, 6198), (8489, 8489), (7929, 7929), (6556, 6074), (6971, 6971), (2044, 6556), (7133, 7133), (383, 383)] 
Các vấn đề liên quan