在python字典中迭代

时间:2013-07-10 22:46:07

标签: python dictionary python-2.6

对不起一个简单的问题,我想我的基本循环错误。我不确定为什么我没有达到预期的结果。

Comp = {'Red':100, 'Blue':101, 'Green':102 ,'Ivory':103, 'White':104}
Comp ['Black'] = 99

def value_for_value(d, mynumber):
    for key, value in d.iteritems():
        print key,value,type(value),mynumber,type(mynumber)
        mykey = 'AAA'
        if value == mynumber:
            mykey = key
    return mykey

print value_for_value(Comp,99)

预期结果:黑色

实际结果: AAA

PS:为了确保我正在比较正确的数据类型,我也打印了数据类型。

2 个答案:

答案 0 :(得分:4)

问题在于,每次循环时,都会设置mykey = 'AAA'。因此,除非str恰好是最后一个值,否则您将用错误的答案覆盖正确答案。

让我们再添加一些打印件以便更好地看到:

def value_for_value(d, str):
    for key, value in d.iteritems():
        mykey = 'AAA'
        if value == str:
            mykey = key
        print key,value,type(value),str,type(str),mykey
    return mykey

>>> value_for_value(Comp, 99)
Blue 101 <type 'int'> 99 <type 'int'> AAA
Ivory 103 <type 'int'> 99 <type 'int'> AAA
Black 99 <type 'int'> 99 <type 'int'> Black
Green 102 <type 'int'> 99 <type 'int'> AAA
White 104 <type 'int'> 99 <type 'int'> AAA
Red 100 <type 'int'> 99 <type 'int'> AAA
'AAA'

那么,你如何解决它?简单:只需将回退值移到循环外部,因此您只需执行一次:

def value_for_value(d, str):
    mykey = 'AAA'
    for key, value in d.iteritems():
        if value == str:
            mykey = key
        print key,value,type(value),str,type(str),mykey
    return mykey

现在:

>>> value_for_value(Comp, 99)
Blue 101 <type 'int'> 99 <type 'int'> AAA
Ivory 103 <type 'int'> 99 <type 'int'> AAA
Black 99 <type 'int'> 99 <type 'int'> Black
Green 102 <type 'int'> 99 <type 'int'> Black
White 104 <type 'int'> 99 <type 'int'> Black
Red 100 <type 'int'> 99 <type 'int'> Black
'Black'

值得注意的是,如果您构建了一个反向字典并将其编入索引,那么整个事情会更简单:

>>> CompInverse = {value: key for key, value in Comp.iteritems()}
>>> CompInverse.get(99, 'AAA')
'Black'

答案 1 :(得分:1)

我认为这样写起来更清楚:

def value_for_value(d, str):
    for k, v in d.iteritems():
        if v == str:
            return k
    return 'AAA'

不会key_for_value是一个更有意义的名字吗?

如果你在不修改d

的情况下进行一系列查找,那么按照@abarnert的建议创建倒置字典是一个好主意。