1

我正在尝试将依赖值附加到下面的列表中并遇到键错误...我在下面有预期的输出..任何人都可以提供关于这里有什么问题的输入吗?

'''
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'
4

3 回答 3

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)

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

于 2013-04-29T21:40:02.137 回答
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
于 2013-04-29T21:42:14.443 回答
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':['']}

于 2013-04-29T23:14:20.680 回答