列表上的哈希函数

时间:2014-04-28 21:21:50

标签: python hash

我有一个包含3个字段的列表:

[weight, age, marks]

我想在每个单独的行上应用哈希函数,并将这些哈希值存储为列表。如何处理?

我使用zip()函数组合了各个重量,年龄,标记列表:

list1=zip(weight,age,marks)

请帮助我,这是我对python的新手。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试在元组结构上创建哈希,例如(1, 444, "fine"),但不能在[1, 444, "fine"]之类的列表上创建,因为它是可变的。

In [56]: weight = 120.0

In [57]: age = 99

In [58]: marks = ("a", "b", "cc")

In [59]: row = [weight, age, marks]

在列表等可变结构上尝试hash将失败:

In [60]: hash(row)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-60-4a104abdcd18> in <module>()
----> 1 hash(row)

TypeError: unhashable type: 'list'

元组是不可变的,这将成功:

In [61]: hash(tuple(row))
Out[61]: 1271481222345795008

请注意,在我的示例中,我创建了marks作为元组,如果您将其作为列表,它也必须转换为元组:

In [62]: marks = ["a", "b", "cc"]

In [63]: hash((weight, age, marks))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-63-7c8ffc07e716> in <module>()
----> 1 hash((weight, age, marks))

TypeError: unhashable type: 'list'

In [64]: hash((weight, age, tuple(marks)))
Out[64]: 1271481222345795008

答案 1 :(得分:0)

怎么样?
map(hash, [weight, age, marks])

它给出以下列表:[hash(weight),hash(age),hash(marks)]

答案 2 :(得分:0)

根据您的问题,我们了解到您实际上有三个列表weightagemarks,并构建了一个包含{{1}所有记录的“表格” }。

现在,您想要获取每个“行”的哈希值。如果要使用Python内置zip(weight, age, marks)函数,则这些行必须为immutable;元组是不可变的,列表不是(如果您不知道元组和列表之间的区别,请查看here)。这没问题,因为hash每个创建的“行”实际上都是一个元组。因此,要获取每行的哈希值,您可以使用map函数:

zip

现在你有哈希中每一行的哈希值(注意你可以用任何带有元组参数的自定义哈希函数替换hashes = map(hash, list1) ,如果你愿意的话)。现在,您在hash中拥有行的所有哈希值,因此hashes是行hashes[23]的哈希值。如果您希望将所有内容都放在一个结构中,只需再次list1[23]

zip

请注意list1_and_hashes = zip(list1, hashes) 的每个元素都是一个包含两个元素的元组:第一个是行本身(反过来是一个元组及其对应的权重,年龄和标记),第二个是行的哈希值。如果您想要一个表格,其中每个元素都有四个字段(权重,年龄,标记和哈希),您可以再次使用list1_and_hashes lambda function

map

然后,您将在list1_and_hashes_2 = map(lambda row_hash: list(row_hash[0]) + list(row_hash[1]), list1_and_hashes) 表中每行包含四个字段。

PD:我假设您使用的是Python 2.在Python 3中,list1_and_hashes_2zip不返回列表,而是generators;在这种情况下,您可能需要使用map包含一些调用来获取实际结构。