2015-11-19 70 views
3

我正在寫一個函數,它接受字典輸入並返回在該字典中具有唯一值的鍵的列表。考慮,keyerror 1在我的代碼

ip = {1: 1, 2: 1, 3: 3} 

因此,輸出應該是[3],因爲關鍵字3具有唯一的值,這是不存在的字典。

現在有問題給出功用:

def uniqueValues(aDict): 

    dicta = aDict 
    dum = 0 
    for key in aDict.keys(): 

     for key1 in aDict.keys(): 

      if key == key1: 
       dum = 0 
      else: 
       if aDict[key] == aDict[key1]: 
        if key in dicta: 
         dicta.pop(key) 
        if key1 in dicta: 
         dicta.pop(key1) 

    listop = dicta.keys() 
    print listop 
    return listop 

我得到錯誤:

File "main.py", line 14, in uniqueValues if aDict[key] == aDict[key1]: KeyError: 1

我哪裏做錯了嗎?

+2

要修改你的字典('dicta.pop(鍵)'),同時通過它迭代導致意想不到的結果。 – Delgan

回答

1

你的主要問題是這一行:

dicta = aDict 

你認爲你正在做的詞典的一個副本,但實際上你還是隻有一個字典,所以在判詞操作也改變aDict(等等,你從adict中刪除值,它們也會從aDict中移除,所以你會得到你的KeyError)。

一個解決辦法是

dicta = aDict.copy() 

(你也應該給你的變量更清晰的名字,使之更加明顯自己,你在做什麼)

(編輯)。另外,一個更簡單的方式做你正在做什麼:

def iter_unique_keys(d): 
    values = list(d.values()) 
    for key, value in d.iteritems(): 
     if values.count(value) == 1: 
      yield key 

print list(iter_unique_keys({1: 1, 2: 1, 3: 3})) 
0

使用Countercollections庫:

from collections import Counter 

ip = { 
    1: 1, 
    2: 1, 
    3: 3, 
    4: 5, 
    5: 1, 
    6: 1, 
    7: 9 
} 

# Generate a dict with the amount of occurrences of each value in 'ip' dict 
count = Counter([x for x in ip.values()]) 

# For each item (key,value) in ip dict, we check if the amount of occurrences of its value. 
# We add it to the 'results' list only if the amount of occurrences equals to 1. 
results = [x for x,y in ip.items() if count[y] == 1] 

# Finally, print the results list 
print results 

輸出:

[3, 4, 7] 
+2

這是執行OP所要做的事情的好方法,但這實際上並不能幫助他理解代碼失敗的原因。 – Delgan

+0

@Delgan,我不會修復他的代碼。教育人們比向他們展示解決方法更好。如果他得到一個解決他的問題的答案,其他人會從這個答案中受益嗎?你想幫助他還是整個社區?想想超越這個盒子,這是一個社區。 –

+1

如果你不幫助他理解代碼有什麼問題,即'dicta = aDict'沒有執行真正的副本,那麼他將在未來犯同樣的錯誤,並再次提出同樣的問題。這不僅僅是展示解決方法,這是解釋和教育。這也有助於其他不知道這個問題的人。提供一種替代和最優雅的方式來執行他正在嘗試做的事情是非常好的,但這不應該是你答案中孤獨的部分,而應該寫出來。 – Delgan