2013-04-29 131 views
1

我試圖將依賴值附加到列表中,如下所示,並運行到keyerror中...我有以下期望的輸出......任何人都可以提供關於這裏出現錯誤的輸入嗎?將值附加到字典列表

''' 
Current output without "+=" in internal_dep[num] +=dep_gerrit :- 
{'313137': '12345', '99999': '', '34567': '99999', '12345': '34567'} 

EXPECTED OUTPUT:- 

{'313137': ['12345', '34567': '99999']} 

''' 
def findinternaldep(num): 
    if num == '313137': 
     output ='12345' 
    if num == '12345': 
     output = '34567' 
    if num == '34567': 
     output = '99999' 
    if num == '99999': 
     output = '' 
    return output 


master_gerrit = ['313137'] 
internal_dep={} 
for num in master_gerrit: 
    while True: 
     print "NUM" 
     print num 
     (dep_gerrit)=findinternaldep(num) 
     internal_dep[num] +=dep_gerrit 
     num = dep_gerrit 
     if dep_gerrit == '': 
      break 
print internal_dep 

錯誤: -

Traceback (most recent call last): 
    File "test_internal.py", line 34, in <module> 
    internal_dep[num] +=dep_gerrit 
KeyError: '313137' 

回答

3

你試圖追加到列表存在於字典的鍵之前。解決這個問題的最簡單方法是讓您的internal_dep字典爲collections.defaultdict。然後,如果該鍵尚不存在,則會自動創建一個默認值(您可以指定)。

import collections 
internal_dep = collections.defaultdict(list) 

還要注意的是+=相當於list.extend而非list.append,所以你應該使用下列之一:

internal_dep[num] += [dep_gerrit] # or 
internal_dep[num].append(dep_gerrit) 

你有什麼不會給你一個錯誤,但它贏得了」不要做你想做的事情!

0

您可以嘗試以下方法。基本上檢查該字典是否已經有關鍵字,如果不添加新的關鍵字則附加到列表中。

if internal_dep.has_key(num): 
    internal_dep[num].append(dep_gerrit) 
else: 
    internal_dep[num]=[dep_gerrit,] 

隨着這一變化,您的總體代碼看起來像:

mmaster_gerrit = ['313137'] 
internal_dep={} 
for num in master_gerrit: 
    while True: 
     print "NUM" 
     print num 
     (dep_gerrit)=findinternaldep(num) 
     print "DEP_GERRIT" 
     print dep_gerrit 
     #print master_gerrit 
     #print dep_gerrit 
     #print depgerrit_status 
     if internal_dep.has_key(num): 
      internal_dep[num].append(dep_gerrit) 
     else: 
      internal_dep[num]=[dep_gerrit,] 
     num = dep_gerrit 
     if dep_gerrit == '': 
      break 
print internal_dep 
+0

上面是不工作..不給預期的輸出...它的工作原理您? – user2125827 2013-04-29 23:06:51

+0

@ user2125827我想我誤解了您的預期答案。但是你想要的輸出{'313137':['12345','34567':'99999']}不是一個有效的python數據結構。也許你想將其修改爲Python接受的內容,然後我們可以進一步修改此解決方案。 – KT100 2013-04-29 23:31:28

+0

我不知道爲什麼它不是一個有效的構造...我的想法是創建一個列表字典... – user2125827 2013-04-30 04:49:48

0

下面是我

list = ['313137','253036'] 
internal_dep={} 
for num in list: 
    master_gerrit = num 
    while True: 
     print "NUM" 
     print num 
     (dep_gerrit)=findinternaldep(num) 
     print "DEP_GERRIT" 
     print dep_gerrit 
     #print master_gerrit 
     print dep_gerrit 

     if internal_dep.has_key(master_gerrit): 
      internal_dep[master_gerrit].append(dep_gerrit) 
     else: 
      internal_dep[num]=[dep_gerrit,] 
     if dep_gerrit == '': 
      break 
     num = dep_gerrit 
print internal_dep 

輸出工作的版本: - { '313137':[ '12345','34567','99999',''],'253036':['']}