Python中元素顺序的随机种子';设置为列表转换
我在Jupyter笔记本中执行一些代码,注意到每次运行它时,输出都是不同的,尽管我的程序中没有明确地加入随机性 我把它缩小到一行,从列表中删除所有重复的元素Python中元素顺序的随机种子';设置为列表转换,python,random,set,Python,Random,Set,我在Jupyter笔记本中执行一些代码,注意到每次运行它时,输出都是不同的,尽管我的程序中没有明确地加入随机性 我把它缩小到一行,从列表中删除所有重复的元素 l = list(set(l)) 我注意到两件事: 如果我在同一个Jupyter内核中重新运行相同的代码,我总是得到相同的l输出,但是 如果我打开另一个笔记本,我会得到不同的输出 是否有某种隐藏的随机种子用于给定内核的set->list转换?它在引擎盖下是如何工作的,如果我想从上述代码中获得确定性输出,我会怎么做?Aset函数几乎与d
l = list(set(l))
我注意到两件事:
- 如果我在同一个Jupyter内核中重新运行相同的代码,我总是得到相同的l输出,但是
- 如果我打开另一个笔记本,我会得到不同的输出
是否有某种隐藏的随机种子用于给定内核的set->list转换?它在引擎盖下是如何工作的,如果我想从上述代码中获得确定性输出,我会怎么做?A
set
函数几乎与dict
相同,以对象的hash
作为键。大多数对象(在CPython中)的默认\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu散列
函数依赖于它们的id
,而id又依赖于它们在内存中的地址
新内核意味着对象有不同的地址,这意味着不同的id
,不同的散列
,以及集合给出的迭代器的不同顺序
这是依赖于实现的,所以你不能依赖它,我只能说CPython,到目前为止,是这样工作的。你可以依赖的是set
没有(有效地)排序
如果您需要订购,请保留列表和集合。如果要在保留顺序的同时删除重复,类似的操作将起作用:
def could_add(s, x):
if x in s:
return False
else:
s.add(x)
return True
seen = set()
[x for x in l if could_add(seen, x)]
(尽管我完全同意Barmar的意见——如果顺序重要,它们应该是可排序的。)集合没有排序,为什么您希望得到一致的结果?如果您想要一致的结果,请对列表排序让我困惑的是,行在单个内核中返回一致的结果?另外,我不能使用排序,因为列表中的项目是不同类型的,不可排序。如果它们不可排序,为什么顺序很重要?我想这不是最重要的,只是为了再现性