Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PYthon—在hashmap中构建列表的第三层_Python_Function_Dictionary_Key - Fatal编程技术网

PYthon—在hashmap中构建列表的第三层

PYthon—在hashmap中构建列表的第三层,python,function,dictionary,key,Python,Function,Dictionary,Key,我目前在《艰苦学习Python》的ex 39上: 我现在真的被这段代码困住了,我试图在代码中添加一个“第三层”的“bucket”,这样每个键都有自己的字典,这样键就可以保存多个值 代码太多,因此我无法将其全部粘贴到此处,但如果您单击链接并向下滚动,您将看到一个名为“三级列表”的副标题,该副标题下的最后一句/第三段如下: 如果要进一步使用此代码,请将其更改为支持每个键的多个值 我已经试着这样做了大约两天了,现在它开始影响我了。我就是找不到办法 如果有人能给我一些指导,我将不胜感激 实现代码后,我遇

我目前在《艰苦学习Python》的ex 39上:

我现在真的被这段代码困住了,我试图在代码中添加一个“第三层”的“bucket”,这样每个键都有自己的字典,这样键就可以保存多个值

代码太多,因此我无法将其全部粘贴到此处,但如果您单击链接并向下滚动,您将看到一个名为“三级列表”的副标题,该副标题下的最后一句/第三段如下:

如果要进一步使用此代码,请将其更改为支持每个键的多个值

我已经试着这样做了大约两天了,现在它开始影响我了。我就是找不到办法

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

实现代码后,我遇到以下错误:

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
我把“key”变量变成了一个可变项——它现在作为一个值以及它自己列表的键出现在一个列表中


所以现在我不能在我以前的散列函数中对它进行散列,我相信,通过添加第三级,他们会说,与其每个键都有一个值,还不如有一个列表

因此,我们更改集合:

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()将返回一个列表,而不是一个值。

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

我是一名来自中国的学生,所以请原谅我奇怪的英语表达。我只是想帮点忙

这是我的代码的关键部分:

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函数时,它将返回一个值,但该值的类型应为list,当我们再次调用它时,它将成为hashmap.get函数中的第二个参数! 如果你没有注意到,计算机会将这个键散列进来,类型是list,这将导致一个不可修复的错误

这是我在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 

非常感谢。这很有帮助。你知道我在哪里可以在线找到一些关于将列表分配给特定值(即“vlist”)的说明文本吗?我想围绕这个概念做一些阅读,并了解它。学习Python似乎并不难。我不知道用谷歌搜索什么来找到关于这个概念的说明/文本来了解它。我不确定你的水平,但是有很多在线python教程。例如,这个wiki页面有一个很大的列表,在实现您的解决方案后,我现在遇到了一个新问题,并且编辑了我的原始答案以突出显示它
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