簡體   English   中英

在 python 中,集合每次都從 0-9 排序?! 不是無序的

[英]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 因此,如果您添加08 ,兩者都想轉到索引0 第一個實際上到達索引0 ,另一個必須轉到其他(更大的)索引。 因此:

>>> {0, 8}, {8, 0}
({0, 8}, {8, 0})

如果改為添加18 ,則1想要轉到索引18想要轉到索引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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM