学习Python-在hashmap中定义get为键返回多个值

学习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

在第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)
    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方法即可。