跳转至

Python 中的 set 和 list 转换时的随机性

在 Python 中,set 和 list 是两种不同的数据结构,它们在使用和功能上有很大的不同。set 是一个无序的、不重复的元素集合,而 list 是一个有序的、可重复的元素集合。

然而,从 set 到 list 的过程并不是一个简单的转换,因为 set 本身就是无序的,所以从 set 到 list 的过程并没有固定的顺序。这意味着每次转换得到的 list 的元素顺序可能都会不同。

在一些项目中,我们希望结果可重现,因此需要确保每一步的结果都没有随机性。许多随机性可以通过随机种子来控制,但从 set 到 list 的过程并不会被随机种子控制住,因此仍然存在随机性。

本文探讨了从 set 到 list 的过程中的随机性,亦作为排查随机性来源的一次记录。

set 到 list 的代码

Python
list({"foo", "bar", "baz", "qux"})

第一次运行的结果

image-20231214123237343

在 Jupyter Notebook 没有被重启前,得到的结果是一样的,因此看起来从 set 到 list 的过程没有随机性。

重启 Kernel 再次运行的结果

image-20231214123842344

可以看到,同样的代码,在重启 Kernel 再次运行时会得到不一样的结果。

解决方案

如果想固定得到的 list 的顺序,可以考虑把得到的 list 进行排序:

Python
sorted(list({"foo", "bar", "baz", "qux"}))

评论