[英]Sets are sorted from 0-9 every single time in python?! Not unordered
起初我認為這是一個巧合,所以我寫了一個測試來試一試,這是真的,我運行了 100 萬次,並且每次返回時都進行了排序和排序。 僅當您使用 0-9 之間的整數時,只要插入 integer > 9 就會發生這種情況,然后插入的任何整數都不會被排序。 為什么是這樣? 同樣對於浮動,它有點排序,但並不總是正確的,所以很奇怪,我認為它們完全是無序的。 任何關於為什么每次都對 0-9 進行排序的建議將不勝感激,我一開始也不相信,所以這是我使用的代碼,你可以自己輕松地運行它,看看它是真的。
import random
def check_set():
constructing = True
s = set()
while constructing:
x = random.randint(0, 9)
if x not in s: s.add(x)
if len(s) == 10: constructing = False
return s
def main():
for x in range(10000):
l = list(check_set())
if l != [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
print('wow')
if __name__ == '__main__':
main()
這些整數對自己進行哈希處理:
>>> [*map(hash, range(10))]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
當您將數字 0 到 9 添加到一個集合中時,該集合至少為 10 個數字(我認為實際上是 32 個)騰出空間。 所以它的內部數組至少有 0 到 9 的索引。並且因為這些數字對它們自己進行哈希處理,所以它們存儲在集合的內部數組中的它們自己的索引處(值i
存儲在索引hash(i)
= i
)。 所以當你迭代它時,你會得到它們的排序。
用較小的例子進一步說明:
集合以內部大小 8 開始,值i
想轉到索引hash(i) % 8
。 因此,如果您添加0
和8
,兩者都想轉到索引0
。 第一個實際上到達索引0
,另一個必須轉到其他(更大的)索引。 因此:
>>> {0, 8}, {8, 0}
({0, 8}, {8, 0})
如果改為添加1
和8
,則1
想要轉到索引1
, 8
想要轉到索引0
,因此無論插入順序如何, 8
始終排在最前面:
>>> {1, 8}, {8, 1}
({8, 1}, {8, 1})
0 到 9 的示例:
>>> s = set()
>>> for i in 8, 9, 0, 1, 2, 3, 4, 5, 6, 7:
s.add(i)
print(s)
{8} # the only element (stored at index 0)
{8, 9} # 9 gets stored at index 1, so after 8
{8, 9, 0} # indices 0 and 1 are already taken, so 0 goes to some higher index
{8, 9, 0, 1} # similar
{0, 1, 2, 8, 9} # the set internally resized and re-added all values, each
# value ends up at its own index (e.g., 8 goes to index 8)
{0, 1, 2, 3, 8, 9} # 3 goes to index 3
{0, 1, 2, 3, 4, 8, 9} # same for the rest, all go to their own index...
{0, 1, 2, 3, 4, 5, 8, 9}
{0, 1, 2, 3, 4, 5, 6, 8, 9}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.