【问题标题】:Why does Python tell me to sort before taking a random sample?为什么 Python 在随机抽样之前告诉我排序?
【发布时间】:2022-01-25 02:38:09
【问题描述】:

Python 只是给了我奇怪的建议:

>>> import random
>>> random.sample({1: 2, 3: 4, 5: 6}, 2)
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    random.sample({1: 2, 3: 4, 5: 6}, 2)
  File "C:\Users\*****\AppData\Local\Programs\Python\Python310\lib\random.py", line 466, in sample
    raise TypeError("Population must be a sequence.  For dicts or sets, use sorted(d).")
TypeError: Population must be a sequence.  For dicts or sets, use sorted(d).

注意最后一个错误行的第二部分。如果我稍后要随机化,我为什么要排序?好像在浪费 O(n log n) 时间。

【问题讨论】:

  • 这是错误的,因为 iter('foo') 是一个迭代器,而不是一个序列。你在哪个版本?我得到“对于 dicts,使用 list(d)。”)" .. 基本上,“找到一些方法将它变成一个列表”..
  • 我想您可能会使用 sorted 来获得可靠的可重复结果。
  • @JeffUK 我用 dict 示例替换了它。但这无关紧要,因为我不是在问我为什么会出错。
  • @JeffUK 我从来没有问过我为什么会出错。我问,在标题和正文中,我为什么要排序。就是这个问题,没有别的。
  • @JeffUK 是的,大多数时候,两者都有效。所以奇怪的是 Python 告诉我这样做效率低下。有时,排序甚至 不起作用(如果 dict 键不支持比较)。

标签: python sorting random


【解决方案1】:

来自 cpython 的提交历史 - 我的重点:github

在未来,population 必须是一个序列。的实例
:class:set 不再受支持。该集合必须首先转换 到 :class:list 或 :class:tuple最好 确定性顺序,以便样本可重现。

如果您不关心可重复性,则无需排序。

【讨论】:

  • 这是有道理的。我会说如果错误消息说 “对于 dicts 或集合,使用 list(d) 或 sorted(d) 以实现再现性”
  • 请注意,the documentation 中也对此进行了说明:自 3.9 版起已弃用:将来,人口必须是一个序列。不再支持 set 的实例。必须首先将集合转换为列表或元组,最好以确定的顺序转换,以便样本可重现。
  • @ThierryLathuille 我认为提交可能来自文档更改。我只是先看看它是什么时候推出的!
猜你喜欢
  • 1970-01-01
  • 2016-07-13
  • 2015-04-12
  • 2019-03-09
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2018-09-12
相关资源
最近更新 更多