与Python 3.3开始,哈希算法是不确定性腌避免某种攻击.这对于Web服务器来说很好,但是在尝试调试程序时会很痛苦:每次运行脚本时,dict内容都会以不同的顺序迭代.
一些早期版本的python有一个-R用于启用散列随机化的标志,但现在它是默认行为,该标志尚未被其相反的替换.可以通过设置环境变量来禁用随机化PYTHONHASHSEED:
PYTHONHASHSEED
如果未将此变量设置或设置为random,则使用随机值为str,bytes和datetime对象的哈希值设定种子.
如果将PYTHONHASHSEED设置为整数值,则将其用作固定种子,以生成散列随机化所涵盖类型的散列().
问题是必须在启动python进程之前设置此变量.我试着与设置os.putenv(),或在os.environ,但这些似乎都对散列方法没有效果.这并不太令人惊讶:我不希望python在每一组或字典查找之前检查环境!所以,问题仍然存在:
有没有办法让python程序禁用自己的哈希随机化?
本机内置的python dict是否保证keys()和values()列表以相同的方式排序?
d = {'A':1, 'B':2, 'C':3, 'D':4 } # or any other content
otherd = dict(zip(d.keys(), d.values()))
Run Code Online (Sandbox Code Playgroud)
我一直都有d == otherd吗?
无论是真还是假,我都对这个主题上的任何引用指针感兴趣.
PS:我理解上面的属性不适用于每个行为都像字典的对象,我只是想知道内置的字典.当我测试它看起来好像是真的,并且它并不奇怪,因为具有相同的顺序,keys()并且values()可能是最简单的实现.但我想知道这种行为是否明确定义.
我已经解决了这个问题,我只想找到一种更有效的方法.我有一个很大的列表列表,我试图将大列表中的每个列表相互比较.
如何避免重复比较,比较已经比较过的列表?
例如:big_list [0]已经与big_list [20]进行了比较,因此没有理由在循环中将big_list [20]与big_list [0]进行比较.
big_list= [[0.12, 0.939, -0.321, 6.342], [0.12, 0.939, -0.321,6.342], [0.0, 1.0, -0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [0.0, 1.0, -0.0, -5.166], [-0.0, 1.0, 0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [0.0,1.0, -0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [-0.0, 1.0, -0.0, -5.166], [-0.0, 1.0, 0.0, -5.166], [-0.12, 0.939, 0.321, 0.282], [-0.12, 0.939, 0.321, 0.282], [0.12, 0.939, 0.321, -17.782], [0.12, 0.939, 0.321, -17.782], [-0.0, 1.0, 0.0, 0.834], [0.0, 1.0, 0.0, 0.834], [0.0, 1.0, …Run Code Online (Sandbox Code Playgroud) 我最近观看了Raymond Hettingers 谈论 Python 字典(以及扩展集......),他提到整数散列到它们自己,并且将整数添加到字典(或集合......)将按顺序插入它们,只要你不要删除项目,订单将保留在 python 3.6(可能是更高版本?)中。在对这个问题的回答中指出,字典保留插入顺序,但对于集合而言,它的接缝就像整数一样根据它们的值进行排序。
现在,根据所述python.org的时间复杂度的部分,并且更详细这里它被指出,添加元素的一组的平均时间复杂度是O(1)。这意味着如果您有一个未排序的整数列表,应该可以通过简单地对它们进行排序:
sorted_list = list(set(unsorted_list))
Run Code Online (Sandbox Code Playgroud)
就我测试过的情况而言,情况确实如此(用随机序列做了几 1000 次)。
我现在的问题是:这是否意味着可以在 O(n) 时间内对 Python 中的整数进行排序?
对我来说它会接缝,因为它需要 O(n) 来构建集合和 O(n) 将集合转换回列表还是我在这里遗漏了什么?
我知道,在 Julia 中,字典不会保留按此处所述插入键的原始顺序,但是使用给定插入顺序构造的字典(和集合)是否保留它们在运行之间使用的任意顺序?这是相关的,因为这意味着可以假定任意顺序在运行之间保持稳定,例如,如果我运行以下代码,则顺序将被保留
\ndictionary = Dict(1 => 77, 2 => 66, 3 => 1, 50 => 2)\nprint(collect(keys(dictionary)))\nRun Code Online (Sandbox Code Playgroud)\n因为每次运行时它总是打印
\n[50, 2, 3, 1]\nRun Code Online (Sandbox Code Playgroud)\n这只是为了表明我的意思,一般来说,对于所有键类型(甚至对于整数)都是如此吗?在这个问题中, @PM 2Ring 给出了一个答案,它描述了对于 Python 集合来说,这并不适用于所有类型,因为
\n\n\n默认情况下, str、bytes 和 datetime 对象的hash () 值是 \xe2\x80\x9csalted\xe2\x80\x9d ,具有不可预测的随机值
\n
以下单元测试在运行时失败(使用 pytest),但是当我调试它时,它通过了:
def test():
assert list(set(['B', 'A'])) == ['A', 'B']
Run Code Online (Sandbox Code Playgroud)
我知道集合没有 order,但我不明白如何确定list(s) ifs是一个集合的结果,这在编写单元测试时至关重要。这里提到的解决方法是将代码更改为sorted(s),但我想了解list(s)运行时会发生什么。
我来到了这个问题,同时琢磨一下的顺序set,frozenset和dict.Python不保证任何排序,任何排序都与hash某个级别的值相关联.但是数字或字符串内置类型的值的哈希值是标准化的吗?换句话说,会
hash((a,b,c,d,e,f,g))
Run Code Online (Sandbox Code Playgroud)
有一个确定的值,如果a,b,c,d,e,f,g是数字值或str?
python ×7
set ×4
list ×3
dictionary ×2
sorting ×2
algorithm ×1
hash ×1
julia ×1
python-3.x ×1
unit-testing ×1