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

标签 python list random set

我对本例中 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"
)

如果列表的长度和 randint() 的上限是,则 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}

docs状态:

A set object is an unordered collection of distinct hashable objects.

这是怎么回事?为什么 set() 在某些情况下对 random_number_list 进行排序,而在其他情况下则不然?

编辑这些问题都不能解决我的问题:

最佳答案

真正回答你的问题。集合的许多实现都使用类似于哈希表的实现。项目被散列并根据该散列值放入“数组”中。

请注意,对于小整数,hash(x) == x。因此,1 将进入插槽 1,2 将进入插槽 2,3 将进入插槽 3,依此类推。然后,当读取元素时,您将真正对元素进行排序。

但是,如果您的整数大于数组大小,那么它们在数组中的位置将以数组大小为模。它们将不再被排序。

再说一次,我并没有真正研究过 Python 的实现。这只是对可能发生的情况的可能解释。

关于python - 为什么Python的set()在某些情况下要对列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70557921/

相关文章:

python - 一般新闻的新闻提要 API

python - 查找字典中所有键的值中字符串的最大出现次数

c++ - 允许用户在内部实现链表时与 std::strings 交互?

list - 从具有 2 个以上元素的元组列表中检索一个元素 (Haskell)

java - 如何生成随机数?

c# - 批量生成随 secret 码

python - 如何比较 Pandas 中两个 DataFrame 的值?

Python Selenium - 如何终止未成功生成的 Chromedriver?

python - 在 Keras 中训练 GAN 时,是否需要多次通过来优化生成器和鉴别器?

python - 在 python 中,random.uniform() 和 random.random() 有什么区别?