【发布时间】:2022-01-02 16:59:02
【问题描述】:
我对这个示例中 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 状态:
集合对象是不同的可散列对象的无序集合。
这里发生了什么?为什么set() 在某些情况下对random_number_list 进行排序而不在其他情况下排序?
编辑这些问题都没有解决我的问题:
【问题讨论】:
-
为什么会出现这个问题?
-
我不认为这是一个问题,我只是不明白为什么会这样,希望有人能启发我。
-
如果它发生在“某些情况下而不是其他情况下”,那么文档就是在告诉您真相,即使它可能发生,您也不应该指望订购。
-
集合通常是无序的(并不意味着它是严格无序的)。顺序可能会因实施而异。