2011-08-20 88 views
3

我是設置()的印象會訂購多少集合類似的.sort()訂購python中的東西......?

但它似乎沒有什麼是特有的我就是爲什麼它重新排序的集合。

>>> h = '321' 
>>> set(h) 
set(['1', '3', '2']) 
>>> h 
'321' 
>>> h = '22311' 
>>> set(h) 
set(['1', '3', '2']) 

爲什麼不返回set(['1','2','3'])。我似乎也看到,無論每個用戶有多少個實例,或者以什麼順序使用它,它總是返回set(['1','3','2'))。爲什麼?

編輯:

所以我已經閱讀你的答案和我的櫃檯這就是這個。

>>> l = [1,2,3,3] 
>>> set(l) 
set([1, 2, 3]) 
>>> l = [3,3,2,3,1,1,3,2,3] 
>>> set(l) 
set([1, 2, 3]) 

它爲什麼訂購數字而不是字符串?

而且

import random 
l = [] 
for itr in xrange(101): 
    l.append(random.randint(1,101)) 

print set(l) 

輸出

>>> 
set([1, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 18, 19, 23, 24, 25, 26, 29, 30, 31, 32, 34, 40, 43, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 69, 70, 74, 75, 77, 79, 80, 83, 84, 85, 87, 88, 89, 90, 93, 94, 96, 97, 99, 101]) 

回答

4

蟒蛇set是無序的,因此也不能保證這些元素會以同樣的方式爲你指定它們

如果您訂購想要排序的輸出,然後調用排序:

sorted(set(h)) 

響應您的編輯:它歸結爲set的實現。在CPython的,把它歸結爲兩點:

1)集將通過哈希(該__hash__功能)進行排序模的限制

2)極限一般爲2

下一個最大功率

因此,讓我們來看看INT情況下:

x=1 
type(x) # int 
x.__hash__() # 1 

的整數,散列等於原始值:

[x==x.__hash__() for x in xrange(1000)].count(False) # = 0 

因此,當所有的值都是整數時,它將使用整數散列值,並且一切工作順利。

的字符串表示,哈希值不相同的方式工作:

x='1' 
type(x) 
# str 
x.__hash__() 
# 6272018864 

要理解爲什麼排序減免[「1」,「2」,「3」],看看那些哈希值:

[str(x).__hash__() for x in xrange(1,4)] 
# [6272018864, 6400019251, 6528019634] 

在我們的例子中,模值是4(3周的ELT,2^1 = 2,2^2 = 4),這樣

[str(x).__hash__()%4 for x in xrange(1,4)] 
# [0, 3, 2] 
[(str(x).__hash__()%4,str(x)) for x in xrange(1,4)] 
# [(0, '1'), (3, '2'), (2, '3')] 

現在,如果排序這是AST,你,你在集看到排序:

[y[1] for y in sorted([(str(x).__hash__()%4,str(x)) for x in xrange(1,4)])] 
# ['1', '3', '2'] 
+0

一個很好的答案! – John

1

python documentation of the set type

一組對象不同可哈希對象的無序集合。

這意味着該集合中沒有元素順序的概念。當元素以不同尋常的順序打印在屏幕上時,您不應該感到驚訝。

1

Python中的一個集合試圖成爲該術語的數學意義上的「集合」。沒有重複,並沒有關係。