PYthon - 在 hashmap 中构建第 3 层列表

PYthon - Building 3rd layer of list within a hashmap

我目前在 Learn Python the Hard way 的 ex 39:http://learnpythonthehardway.org/book/ex39.html

我现在真的被这段代码困住了,我试图在代码中添加一个 'third layer' of 'buckets' 这样每个单独的键都有自己的字典,这样键就可以保存多个值。

代码太多,所以我无法将其全部粘贴到这里,但是如果您单击 link 并向下滚动,您将看到一个名为:"Three Levels of Lists" 的子标题和最后一个sentence/third 该副标题下的段落内容为:

"If you want to take this code further, then change it to support multiple values for each key."

我已经尝试这样做大约两天了,现在我开始明白了。我只是看不出有什么办法。

如果有人能给我一些指导,我将不胜感激。

实施代码后,出现此错误:

File "ex39_test.py", line 34, in <module>
print "Michigan has: %s" % hashmap2.get(cities, hashmap2.get(states,     'Michigan'))
File "C:\python27\hashmap2.py", line 27, in get
i, k, vlist = get_slot(aMap, key, default=default)
File "C:\python27\hashmap2.py", line 18, in get_slot
bucket = get_bucket(aMap, key)
File "C:\python27\hashmap2.py", line 13, in get_bucket
bucket_id = hash_key(aMap, key)
File "C:\python27\hashmap2.py", line 10, in hash_key

实施您的代码建议的这一部分后:

def set(aMap, key, value):
bucket = get_bucket(aMap, key)
i, k, vlist = get_slot(aMap, key)

if i >= 0:
    # if value is already in the key-list
    if value in vlist:
        return
    vlist.append(value)
else:
    bucket.append((key, list(value)))

我将 'key' 变量变成了一个可变项 - 它现在作为一个值以及它自己列表的键在列表中。

所以现在我不能用我以前的散列函数散列它

我相信,通过添加第 3 级,他们表示您应该有一个列表,而不是每个键都有一个值。

所以我们更改集合:

def set(aMap, key, value):
"""Sets the key to the value, only adds new values"""
  bucket = get_bucket(aMap, key)
  i, k, vlist = get_slot(aMap, key)
  if i >= 0:
      # check if value is already in list, if so, do nothing
      if value in vlist:
            return
      # the key exists, so just add they value to it
      vlist.append(value)
  else:
      # the key is not in table, add a list for the key
      # allows multiple values for each key
      bucket.append((key, list(value)))

我相信其他功能保持不变。请注意,get() 将 return 一个列表,而不是单个值。

我也尝试在哈希映射中构建第 3 层,我做到了,这就是我的代码实现的。

Because type 'list' is not hashable,so let's keep the 'key' type still 'string',and made 'value' type list. Ps: 我是来自中国的学生所以请原谅我的英语很奇怪 expression.just 希望对您有所帮助!

这是我代码的关键部分:

def set(aMap, key, value):
'''Sets the key to the value, replacing an existing value.'''
    bucket = get_bucket(aMap, key)
    i, k, vlist = get_slot(aMap, key)

    if i >= 0:
    # the key exists, append it
        vlist.append(value)
    else:
    # the key does not, append to creat it
        bucket.append((key,[value])) 
    # attention! the key is string and value becomes list,which is the 3rd layer of bucket.

其他功能也需要做一些相应的改动。

并且,请注意 ex39_test.py 中的此语句:

    print "Michigan has: %s" % hashmap.get(cities, hashmap.get(states, 'Michigan'))

在上面的语句中,当我们第一次调用hashmap.get函数时,它会return一个值,但是这个值的类型应该是list,它成为了函数中的第二个参数hashmap.get 再次调用时的函数! 如果你没有注意到它,计算机会把这个键散列到列表中,这将导致一个无法散列的错误。

这就是我在 hashmap.py 中修复它的方法:

def get(aMap, key , default = None):
'''Gets the value in a bucket for the given key, or the default.'''
    if type(key) == type (' ') :
    # if key's type is string,then nothing changes.
        i, k, vlist = get_slot(aMap, key, default)
    else: 
        i, k, vlist = get_slot(aMap, key[0], default) 
# in this way the second parameter is string again and it won't cause unhashable mistake.
    return vlist