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