2014-08-29 80 views
0

在Learn Python the Hard Way,Lesson 39中,您創建了一個hashmap來導入並用作Python內置字典的模擬。學習Python-定義在hashmap中返回鍵的多個值

最初,它是這麼寫的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)) 

如果我運行下面的,它其實名單的一切我進入,而不會覆蓋像第一套功能將有:

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 

然而,我似乎無法獲得'獲取'功能來打印'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) 

我認爲它需要有一些類型的循環,通過每個鍵運行沒有當它看到它的第一次剛剛停止,但我可以不知道會做什麼。

此外,我寫的循環只是返回「無」每個獲得。所以我顯然缺少一些東西(或幾件事)。

我錯過了什麼?謝謝。

+0

你第一次'返回'k ==鍵,你期望會發生什麼? – jonrsharpe 2014-08-29 15:32:22

+0

我不確定我在想什麼。它有道理,它會返回第一個k ==鍵,但我想如果我做了一個循環,它會返回_every_實例,其中k ==鍵。顯然,我錯了。 – datahappy 2014-08-29 15:33:52

+3

你需要找出一種方法來移動'for'循環外部的'return' * - 一旦函數返回'return',就結束了。 – jonrsharpe 2014-08-29 15:34:52

回答

0

但是,這種行爲:有一個獨特的鍵值對,實際上是你想要的!如果您有兩個相同的密鑰,則哈希函數無法工作,對!

在你的情況下,這種行爲是由你行實現:

#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']} 
+0

那麼,我怎麼能包含在Def Defin中的key.append? – datahappy 2014-08-30 01:57:35

+0

我在if>> 0:語句中嘗試了幾件事,但無法獲得它追加 – datahappy 2014-08-30 01:58:18

+0

沒有必要創建一個追加函數,這不是一個哈希表的想法,而是一個完全不同的概念。如果你想模仿python字典,就像以前一樣使用一個鍵值對,但使用一個python列表對象作爲值。然後,如果您通過設置的函數返回值,只需使用append方法列表。 – Sebastian 2014-08-30 05:17:33