将值附加到词典列表

时间:2013-04-29 21:29:51

标签: python

我正在尝试将依赖值附加到列表中,如下所示并运行到一个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 个答案:

答案 0 :(得分: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)

你所拥有的不会给你一个错误,但它也不会做你想要的!

答案 1 :(得分:0)

您可以尝试以下方法。基本上检查dict是否已经有密钥,如果没有添加新密钥,则附加到列表中。

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

答案 2 :(得分: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':['']}