首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Python的set()在某些情况下对列表进行排序?

为什么Python的set()在某些情况下对列表进行排序?
EN

Stack Overflow用户
提问于 2022-01-02 16:59:02
回答 3查看 112关注 0票数 2

我对Python的set()在本例中的行为感到困惑:

代码语言:javascript
复制
random_number_list = [randint(1, 10) for _ in range(10)]
# This will be sorted!
unique_numbers = set(random_number_list)

print(
    f"random_number_list/unique_numbers with same upper bound for randint() and range():\n{random_number_list=}\n{unique_numbers=}\n"
)

random_number_list = [randint(1, 100) for _ in range(10)]
# This will not be sorted.
unique_numbers = set(random_number_list)

print(
    f"random_number_list/unique_numbers with different upper bound for randint() and range():\n{random_number_list=}\n{unique_numbers=}\n"
)

如果列表的长度和set()的上限相同,则似乎是set()random_number_list进行排序:

代码语言:javascript
复制
➜  ch-2 python --version
Python 3.10.0
➜  ch-2 python find_k_smallest.py 
random_number_list/unique_numbers with same upper bound for randint() and range():
random_number_list=[10, 1, 2, 5, 5, 7, 8, 8, 2, 8]
unique_numbers={1, 2, 5, 7, 8, 10}

random_number_list/unique_numbers with different upper bound for randint() and range():
random_number_list=[35, 1, 17, 26, 17, 74, 26, 11, 44, 13]
unique_numbers={1, 35, 74, 11, 44, 13, 17, 26}

文档状态:

set对象是不同的可哈斯对象的无序集合。

这里发生了什么事?为什么set()要在某些情况下对random_number_list进行排序,而不是在其他情况下呢?

编辑这两个问题都没有解决我的问题:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-02 17:29:23

来回答你的问题。sets的许多实现使用类似于哈希表的实现。基于该哈希值,项被散列并放置到“数组”中。

请注意,对于小整数,散列( x ) == x。所以1将进入槽1,2将进入槽2,3进入槽3,然后当元素被读取时,您将得到真正的排序元素。

但是,如果您的整数大于数组大小,则它们在数组中的位置将是数组大小的模。它们将不再被分类。

同样,我还没有实际查看Python实现。这只是对可能发生的事情的一种可能的解释。

票数 3
EN

Stack Overflow用户

发布于 2022-01-02 17:33:40

“无序”并不意味着“没有排序”。这意味着不尝试提供任何特定的顺序;从实现中流出的顺序可能是排序的,也可能不是排序的。

票数 2
EN

Stack Overflow用户

发布于 2022-01-02 22:49:18

你在评论中写道:

我很好奇为什么当set()的大小与randint()的界限相关时,为什么要排序它的成员。

这是应用程序不应该关注的实现细节,即使在Python3.7(和3.10)中,set也是记录为“无序collection[s]”。例如,您可以查找CPython源代码来查找S在CPython中实现。

另请参阅:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70557921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档