Python集合到列表转换中元素顺序的随机种子

2024-03-29 07:44:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Jupyter笔记本中执行一些代码,注意到每次运行它时,输出都是不同的,尽管我的程序中没有明确地加入随机性

我把它缩小到一行,从列表中删除所有重复的元素

l = list(set(l))

我注意到两件事:

  • 如果我在同一个Jupyter内核中重新运行相同的代码,我总是得到相同的l输出,但是

  • 如果我打开另一个笔记本,我会得到不同的输出

是否存在某种用于集合的隐藏随机种子->;给定内核的列表转换?它是如何工作的,如果我想从上面的代码中得到确定性的输出,我会怎么做


Tags: 代码gt程序元素列表笔记本jupyter种子
1条回答
网友
1楼 · 发布于 2024-03-29 07:44:28

set的功能几乎与dict相同,对象的hash作为键。大多数对象(在CPython中)的默认__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)]

(尽管我完全同意巴尔马的评论——如果订单很重要,它们应该是可排序的。)

相关问题 更多 >