在Python中散列数组

eng*_*ree 48 python arrays hash

哈希有可能lists吗?

例如,我知道元组的哈希是可能的:

>>> hash((1,2,3,4,5,6))
-319527650
Run Code Online (Sandbox Code Playgroud)

但是有可能哈希list吗?

>>> hash([1,2,3,4,5,6])
hash_value
Run Code Online (Sandbox Code Playgroud)

可能解决方案

这里列出了对列表散列的深入解释.

Rom*_*huk 51

就试一试吧:

>>> hash((1,2,3))
2528502973977326415
>>> hash([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(frozenset((1,2,3)))
-7699079583225461316
>>> hash(set((1,2,3)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
Run Code Online (Sandbox Code Playgroud)

所以,你可以得到hashtuple,并frozenset因为是不可变的,你不能做到这一点list,并set因为他们是可变的.

  • 哦亲爱的,如果可以的话,我会投票给自己的评论.我只是通过比较哈希的前几位来欺骗自己. (19认同)
  • @cgogolin值不同,一切正常. (17认同)
  • @cgogolin反正很好的观察.如此多的相等数字不应该是巧合,这表明散列算法不是很好. (9认同)
  • "哈希算法不是很好".取决于你需要它.你用它来加密吗?好吧,不要这样做,因为哈希与输入相关.您是否需要快速获取哈希值才能查找字典键?那么这是一个非常精细的哈希算法. (6认同)

Ohm*_*ess 15

如果您确实需要使用列表作为字典键,请先尝试将其转换为字符串.
my_list = str(my_list)

  • 如果您打算转换到另一种数据类型的麻烦,那么元组会不会更有意义? (35认同)
  • 对于包含更多列表的列表,到元组的递归转换比简单的“str()”更简单。 (4认同)

Ned*_*der 8

Python不允许您将可变数据用作词典中的键,因为插入后的更改会使对象无法找到.您可以使用元组作为键.

  • 这有点不正确,用户定义的类可以编写为可清除(因此可以成为dict中的键)但是很难在Python中创建不可变的用户定义类. (6认同)