我对Python的set()在本例中的行为感到困惑:
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进行排序:
➜ 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进行排序,而不是在其他情况下呢?
编辑这两个问题都没有解决我的问题:
发布于 2022-01-02 17:29:23
来回答你的问题。sets的许多实现使用类似于哈希表的实现。基于该哈希值,项被散列并放置到“数组”中。
请注意,对于小整数,散列( x ) == x。所以1将进入槽1,2将进入槽2,3进入槽3,然后当元素被读取时,您将得到真正的排序元素。
但是,如果您的整数大于数组大小,则它们在数组中的位置将是数组大小的模。它们将不再被分类。
同样,我还没有实际查看Python实现。这只是对可能发生的事情的一种可能的解释。
发布于 2022-01-02 17:33:40
“无序”并不意味着“没有排序”。这意味着不尝试提供任何特定的顺序;从实现中流出的顺序可能是排序的,也可能不是排序的。
发布于 2022-01-02 22:49:18
你在评论中写道:
我很好奇为什么当
set()的大小与randint()的界限相关时,为什么要排序它的成员。
这是应用程序不应该关注的实现细节,即使在Python3.7(和3.10)中,set也是记录为“无序collection[s]”。例如,您可以查找CPython源代码来查找S在CPython中实现。。
另请参阅:
https://stackoverflow.com/questions/70557921
复制相似问题