【发布时间】: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