【问题标题】:Why is map function not effective?为什么地图功能无效?
【发布时间】:2017-08-03 03:43:40
【问题描述】:

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

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

【问题讨论】:

  • 您的map 行似乎有一个额外的右括号?
  • 我怀疑您使用的是 Python 3,其中 map 返回一个迭代器。所以map 不会调用该函数,直到您遍历 map 迭代器。但是,您不应该将map 纯粹用于这样的副作用。
  • @PM2Ring:是的,这是有道理的。我正在使用 python3
  • 类似地,这样做[a.put(x,x) for x in input_value] 是一种不好的风格,因为它使用列表推导来处理方法调用的副作用,而您实际上并不想要列表,这可能是充满None

标签: python python-3.x class dictionary


【解决方案1】:

我将在这里冒险并假设您使用的是 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]

Nones 是副作用的典型症状。不过……

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

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

【讨论】:

  • 这是一个巨大的变化,永远不会改变到 python3 然后 :D 更多,像l = map(...) 这样的赋值会触发惰性评估吗?没有python3可以尝试。
  • 顺便说一下,在你的例子中应该是m = map(lambda x: s.add(x), [1, 2, 3]),不能编辑答案,因为6个字符的规则不符合
  • @armnotstrong 1. 它没有,并且 2. 它是有效的语法 - lambda 的范围说明符。
  • 查看截图上的版本,是Python3.6.2
  • 哈哈,这就是人们不转向 python3 的原因:D
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2021-08-30
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多