0

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

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:为了确保我比较正确的数据类型,我也打印了数据类型。

4

2 回答 2

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'
于 2013-07-10T22:50:23.083 回答
1

我认为这样写更清楚:

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

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

如果您将在不修改的情况下进行大量查找,则按照@abarnert 的建议创建倒排字典是一个好主意d

于 2013-07-11T00:19:34.497 回答