2024-03-29 07:44:28 发布
网友
我在Jupyter笔记本中执行一些代码,注意到每次运行它时,输出都是不同的,尽管我的程序中没有明确地加入随机性
我把它缩小到一行,从列表中删除所有重复的元素
l = list(set(l))
我注意到两件事:
如果我在同一个Jupyter内核中重新运行相同的代码,我总是得到相同的l输出,但是
如果我打开另一个笔记本,我会得到不同的输出
是否存在某种用于集合的隐藏随机种子->;给定内核的列表转换?它是如何工作的,如果我想从上面的代码中得到确定性的输出,我会怎么做
set的功能几乎与dict相同,对象的hash作为键。大多数对象(在CPython中)的默认__hash__函数依赖于它们的id,后者又依赖于它们在内存中的地址
set
dict
hash
__hash__
id
新内核意味着对象有不同的地址,这意味着不同的id,不同的hash,以及集合给出的迭代器的不同顺序
这是依赖于实现的,所以你不能依赖它,我只能说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)]
(尽管我完全同意巴尔马的评论——如果订单很重要,它们应该是可排序的。)
set
的功能几乎与dict
相同,对象的hash
作为键。大多数对象(在CPython中)的默认__hash__
函数依赖于它们的id
,后者又依赖于它们在内存中的地址新内核意味着对象有不同的地址,这意味着不同的
id
,不同的hash
,以及集合给出的迭代器的不同顺序这是依赖于实现的,所以你不能依赖它,我只能说CPython,到目前为止,是这样工作的。你可以依赖的是
set
没有(有效地)有序如果您需要订购,请保留列表和集合。如果要在保留顺序的同时删除重复,类似的操作将起作用:
(尽管我完全同意巴尔马的评论——如果订单很重要,它们应该是可排序的。)
相关问题 更多 >
编程相关推荐