【问题标题】:Is set deterministic? [duplicate]集合是确定性的吗? [复制]
【发布时间】:2019-01-26 09:54:03
【问题描述】:

在阅读Get unique values from a list in python等问题时,可以看到订单不能保留的备注。

这是可以理解的。让我烦恼的是它走得更远——我可以看到执行甚至不是确定性的,即:

list(set(values_list))

我会得到唯一的值,问题是每次运行的结果都会有不同的顺序。所以这意味着set(构造函数或枚举数)不是确定性的。

我想知道它是怎么发生的?我看不出为什么在单线程执行时(?)你会得到不确定的行为。

当然,可以对结果进行排序以强制执行确定性行为,但是一旦您发现手头有非确定性代码,您就会得到这样的想法。

更新:

我的代码的本质——该文件是一个包含 10 000 个字符串(具有 3 个唯一值)数组的泡菜。

combined = pickle.load(open("labels.p", "rb"))
label_keys = list(set(combined))
print(label_keys)

每次运行我都会得到不同的顺序。哦,我用的是 Python 3.6.4。

【问题讨论】:

  • 集合是无序的。因此,不能保证将集合转换为列表每次都具有相同的结果。
  • 澄清一下,这个问题是:“为什么集合构造函数是不确定的?”
  • @mkrieger1 这并不意味着每次都是随机除非是:mail.python.org/pipermail/python-announce-list/2012-March/…
  • 你能举个例子吗?当我尝试时,list(set(values)) 总是以相同的顺序进行游戏(使用随机数列表进行测试,包括 3.6 和 2.7)
  • @Joel 因为答案同样适用于字典和集合。

标签: python


【解决方案1】:

到目前为止我还没有看到这个问题:

>>> values_list = range(100) * 3
>>> a = list(set(values_list))
>>> b = list(set(values_list))
>>> a == b
True
>>> 

【讨论】:

  • 那是巧合。
  • “我连续两次得到相同的结果”并不是确定性行为的证据。
  • 在什么版本的 Python 上...?
  • @deceze OP 没有指定任何特定版本
  • 当然,但是版本is important
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2012-05-13
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多