我有一个包含3个字段的列表:
[weight, age, marks]
我想在每个单独的行上应用哈希函数,并将这些哈希值存储为列表。如何处理?
我使用zip()
函数组合了各个重量,年龄,标记列表:
list1=zip(weight,age,marks)
请帮助我,这是我对python的新手。提前谢谢。
答案 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)
根据您的问题,我们了解到您实际上有三个列表weight
,age
和marks
,并构建了一个包含{{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_2
和zip
不返回列表,而是generators;在这种情况下,您可能需要使用map
包含一些调用来获取实际结构。