为什么地图功能无效?



我没有被击中或任何东西,但我觉得这很奇怪。以下是我处理过的代码片段:

from hashClass import HashTable
a = HashTable(11)
input_value = list((54,26,93,17,77,31,44,55,20))
map(lambda x: a.put(x,x),input_value))
print(a.data)

我已经创建了自己的哈希表类。它有一个名为 put 的方法,它接受键值对,"HashTable.data"属性显示表中的所有值。

当我将 put 方法与普通键值对一起使用时,它完全可以正常工作。我知道该解决方案可以使用以下方法实施:

for i in input_value: a.putt(i,i)

但是我想知道为什么地图功能无效?当我尝试使用"put"方法映射每个input_value时,如果我没有错的话,它必须将值添加到实例中。我的原因是我可能没有使用映射的值,但是在语法上,当我映射时,它应该更新实例变量。

下面是我创建的哈希类以供参考。

class HashTable(object):
def __init__(self,size):
self.size = size
self.slots = self.size*[None]
self.data = self.size*[None]
self.values = 0
def put(self,key,value):
hashValue = self.hashFunction(key)
if self.slots[hashValue] == None:
self.slots[hashValue] = key
self.data[hashValue] = value
self.values += 1
elif self.slots[hashValue] == key:
self.data[hashValue] = value
else:
hashValue = self.reHash(hashValue)
while self.slots[hashValue] != None and self.slots[hashValue] != key:
hashValue = self.reHash(hashValue)
self.slots[hashValue] = key
self.data[hashValue] = value
self.values += 1

def reHash(self,oldValue):
return (oldValue+1)%self.size
def __len__(self):
return self.values

def get(self,key):
hashValue = self.hashFunction(key)
if self.slots[hashValue] == None:
return "No Value associated"
elif self.slots[hashValue] == key:
return self.data[hashValue]

def hashFunction(self,key):
return key%self.size

我将在这里冒昧地假设您使用的是 Python3。

使用 python3,map有助于惰性计算,这意味着除非确实需要,否则它不会执行其功能。您要做的是使用map产生副作用。当然,您可以使用以下方法执行此操作:

list(map(lambda x: a.put(x,x), input_value)))

list()强制进行评估。

然而,使用map治疗副作用在某种程度上是一种反模式。我更喜欢更清晰、更惯用的东西,比如你提到的for循环。


举个例子:

In [854]: s = set()
In [862]: m = map(lambda x=x: s.add(x), [1, 2, 3])
In [863]: s
Out[863]: set()

到目前为止,s什么也没发生。现在,将list()应用于map对象。

In [864]: list(m)
Out[864]: [None, None, None]

None是副作用的典型症状。然而。。。

In [865]: s
Out[865]: {1, 2, 3}

所以,它有效。但它肯定不好看。

最新更新