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
我目前在 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