2012-08-17 71 views
2

這是我在Python集中注意到的奇怪事情。我讀過沒有訂單的訂單,但是它確實從0到79以及後來從79到127之間流行了較低的元素。它不會再彈出較低的元素。只有在128進來後,79纔會彈出。這是爲什麼?Python - sets .pop()行爲

是否有任何替代方案,我可以在Python中使用有序的數據結構? 爲什麼從0到79而不是從79到127最低?

>>s = set() 
>>s.add(72) 
>> s.add(74) 
>> s.add(76) 
>> s.pop() 
72 
>> s.add(79) 
>> s.pop() 
74 
>> s.add(81) 
>> s 
set([81, 76, 79]) 
>> s.pop() 
76 
>> s.add(83) 
>> s 
set([81, 83, 79]) 
>> s.add(85) 
>> s 
set([81, 83, 85, 79]) 
>> s.pop() 
81 
>> s 
set([83, 85, 79]) 
+0

的可能重複(http://stackoverflow.com。[是否有Python的有序集合?]/questions/1653970/does-python-have-an-ordered-set)(或者,可能是http://stackoverflow.com/questions/10432022/in-python-is-set-pop-deterministic) – geoffspear 2012-08-17 12:05:51

+2

這不是一個甚至想知道這樣的行爲背後的實現的好主意,因爲它們絕對不能保證或預期在實現之間的版本*或*之間是穩定的;如果您在CPython上進行測試,您將無法在IronPython或Jython上獲得相同的行爲,並且不能保證下一個將出現的CPython也會具有相同的行爲。 – 2012-08-17 13:18:49

+0

謝謝你的幫助 – thanmai 2012-08-20 05:38:06

回答

1

爲什麼它會從0到79而不是從79到128最低?
嗯,不,排序不是隨機的,但它是完全隨意的。 Python集中沒有特定的順序。試想一下:

>>> s.add(14) 
>>> s.add(11) 
>>> s.add(3) 
>>> s.add(13) 
>>> s.add(2) 

>>> s.pop() 
13 
>>> s.pop() 
14 
>>> s.pop() 
2 
>>> s.pop() 
3 
>>> s.pop() 
11 

這不符合你的結論(這個時間正好14)

+0

>>> s = set() >>> s.add(14) >>> s.add(11) >>> s.add(3) >>> s .add(13) >>> s.add(2) >>> s set([3,2,11,13,14]) >>> s.pop() >>> s.pop() >>> s.pop() >>> s.pop() >>> s.pop() >>> 但是我得到這個作爲輸出。我錯誤地輸出了從0到79.感謝您的幫助。 – thanmai 2012-08-20 05:35:27