为什么地图功能不起作用?

问题描述 投票:0回答:2

我并没有受到什么打击,但我觉得很奇怪。以下是我编写的代码片段:

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
python python-3.x class dictionary
2个回答
6
投票

我将大胆假设您正在使用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}

所以,它有效。但看起来确实不太好。


0
投票
我找不到具有以下功能的地图功能 从: 并: 不再了。他们会直接进行销售宣传,然后再向您提供您想要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.