学习Python-在hashmap中定义get为键返回多个值
在第39课的《艰苦学习Python》中,您将创建一个hashmap以导入并用作Python内置字典的模拟 最初,它是这样编写的,hashmap一次只允许一个键:学习Python-在hashmap中定义get为键返回多个值,python,Python,在第39课的《艰苦学习Python》中,您将创建一个hashmap以导入并用作Python内置字典的模拟 最初,它是这样编写的,hashmap一次只允许一个键: def get(aMap, key, default = None): """Gets the value in a bucket for the given key, or the default""" i, k, v = get_slot(aMap, key, default = default) retur
def get(aMap, key, default = None):
"""Gets the value in a bucket for the given key, or the default"""
i, k, v = get_slot(aMap, key, default = default)
return k, v
def set(aMap, key, value):
"""Sets the key to the value, replacing any existing values"""
bucket = get_bucket(aMap, key)
i, k, v = get_slot(aMap, key)
if i >= 0:
#the key exists, replace it
bucket[i] = (key, value)
else:
#The key does not exist, append and create it
bucket.append((key, value))
在研究训练中,如果挑战是更改它,使键可以具有多个值,则需要进行一次测试。我只是让它附加值,不管键是否存在
def set(myMap, key, value):
bucket = get_bucket(myMap, key)
i, k, v = get_slot(myMap, key)
bucket.append((key, value))
如果我运行以下命令,它实际上会列出我输入的所有内容,而不会像第一个set函数那样进行覆盖:
jazz = myHashmap2.new()
myHashmap2.set(jazz, 'Miles Davis', 'Flamenco Sketches')
myHashmap2.set(jazz, 'Miles Davis', 'Kind of Blue')
myHashmap2.set(jazz, 'Duke Ellington', 'Beginning to see the light')
myHashmap2.set(jazz, 'Billy Strayhorn', 'Lush Life')
print "-----List Test-----"
myHashmap2.list(jazz)
我得到:
-----List Test-----
Billy Strayhorn Lush Life
Miles Davis Flamenco Sketches
Miles Davis Kind of Blue
Duke Ellington Beginning to see the light
但是,我似乎无法让“get”函数同时打印“Miles Davis”值。它总是达到“弗拉门戈草图”的值,并去掉了“蓝色”
print "-----Get Test-----"
print ex39_hashmap.get(jazz, 'Miles Davis')
print ex39_hashmap.get(jazz, 'Duke Ellington')
print ex39_hashmap.get(jazz, 'Billy Strayhorn')
-----Get Test-----
('Miles Davis', 'Flamenco Sketches')
('Duke Ellington', 'Beginning to see the light')
('Billy Strayhorn', 'Lush Life')
我试过几种方法:
def get(myMap, key, default = None):
i, k, v = get_slot(myMap, key, default = default)
if k == key:
return (k, v)
def get(myMap, key, default = None):
bucket = get_bucket(myMap, key)
i, k, v = get_slot(myMap, key, default = default)
for i, k in bucket:
if k == key:
return (k, v)
我假设它需要某种循环,在它第一次看到每个键时不停地运行,但我不知道该怎么做
此外,我编写的循环只为每个get返回“None”。因此,我显然遗漏了一些东西(或一些东西)
我错过了什么?谢谢。但是这种行为:拥有一个唯一的键值对,实际上就是你想要的!如果您有两个相同的键,则哈希函数无法工作,对吧 在您的情况下,此行为是通过您的线路实现的:
#the key exists, replace it
bucket[i] = (key, value)
这也是Python字典的工作方式。以下是一个例子:
my_dict1 = dict()
my_dict1['Miles Davis'] = 'Flamenco Sketches'
my_dict1['Miles Davis'] = 'Kind of Blue'
my_dict1['Duke Ellington'] = 'Beginning to see the light'
print(my_dict1)
{'Duke Ellington': 'Beginning to see the light', 'Miles Davis': 'Kind of Blue'}
如果希望多个“值”与一个键关联,则可以使用一种变通方法,将值设置为可变对象并附加到该对象:
my_dict2 = dict()
my_dict2['Miles Davis'] = ['Flamenco Sketches']
my_dict2['Miles Davis'].append('Kind of Blue')
my_dict2['Duke Ellington'] = 'Beginning to see the light'
print(my_dict2)
{'Duke Ellington': 'Beginning to see the light', 'Miles Davis': ['Flamenco Sketches', 'Kind of Blue']}
你
第一次返回k==key
,你期望会发生什么?我不确定我的想法。它将返回第一个k==键,这是有道理的,但我认为如果我执行循环,它将返回k==键所在的每个实例。显然,我错了。您需要找到一种方法将返回
移动到for
循环之外-一旦函数点击返回
,它就结束了。啊!我一整天都在想这个问题!我可以让它打印正确的答案,但它也不会为每个不匹配的键打印任何答案。你能给我点什么资源帮我弄明白吗?请不要告诉我答案,只是一个能帮我弄明白的资源。如果有道理的话,我需要在不被完全告知的情况下了解这一点。:)那么,如何将key.append包含在set Def中呢?我在if I>=0:语句中尝试了几种方法,但无法将其添加到append中。不需要创建append函数,这不是哈希表的概念,而是完全不同的概念。如果要模拟python dict,只需像前面一样使用键、值对,但使用python列表对象作为值。然后,如果通过set函数返回值,只需对列表使用append方法即可。