python使一个函数调用该名称来获取id#

时间:2014-01-16 19:09:43

标签: python dictionary

对不起python的新手,当我说getID('foo')时试图制作一个func,它会返回我的id#。

info = {1:   {'desc': 'one',    'length': 1, 'id': 1,    'weight': '4',  'name': 'foo'}, 
       506:  {'desc': 'two',    'length': 2, 'id': 506,  'weight': '32', 'name': 'bar'}, 
       1156: {'desc': 'Three.', 'length': 3, 'id': 1156, 'weight': '64', 'name': 'too'}}

这就是我所拥有的,但它没有得到我想要的东西。任何帮助都会非常感谢

def GetID(name):

    for v in info.values():
        for k in v.keys():
            if k == name:
                return(v[id])
            else:
                return "wrong name"

5 个答案:

答案 0 :(得分:2)

使用正确的数据结构会使这更容易 - 并且假设您多次调用GetID,也会快得多。 (一般来说,当您发现从数据中提取所需信息太复杂时,答案通常是更改数据结构。)

如果你有一个字典将每个name映射到id,你可以这样做:

def GetID(name):
    return name_to_id.get(name, "wrong name")

如果您以前从未见过d.get(key, default),则相当于d[key],但如果该密钥不存在,则会获得default而不是KeyError }}


那么,你如何建立这本字典呢?好吧,你已经知道如何明确地迭代你现有的字典,所以让我们这样做:

name_to_id = {}
for v in info.values():
    name_to_id[v['name']] = v['id']

如果你想让它更简洁:

name_to_id = {v['name']: v['id'] for v in info.values()}

无论哪种方式,您只需循环遍历字典一次,即可设置name_to_id映射,而不是每次需要查找名称时。这是一个更简单的循环。

这意味着每个名称查找现在都非常简单且非常快。

答案 1 :(得分:1)

  1. ie_info与全局变量info不匹配。
  2. 引用idv['id']
  3. 您不需要迭代所有字典条目来检查name键值。
    • 只需使用dict['name']dict['id']
    • 即可

  4. >>> info = {1:   {'desc': 'one',    'length': 1, 'id': 1,    'weight': '4',  'name': 'foo'},
    ...        506:  {'desc': 'two',    'length': 2, 'id': 506,  'weight': '32', 'name': 'bar'},
    ...        1156: {'desc': 'Three.', 'length': 3, 'id': 1156, 'weight': '64', 'name': 'too'}}
    >>>
    >>>
    >>> def GetID(name):
    ...     for v in info.values():
    ...         if v['name'] == name:
    ...             return(v['id'])
    ...     return 'wrong name'
    ...
    >>> GetID('foo')
    1
    >>> GetID('who')
    'wrong name'
    

答案 2 :(得分:0)

def GetID(name):

    for v in info.values(): # your variable is called info not ie_info
        for k in v.keys():
            if k == 'name':
                return(v['id']) # you were missing the quotes around id
            else:
                return "wrong name"

答案 3 :(得分:0)

def GetID(name):
    return [x['id'] for x in info.values() if x['name'] == name]

这就是你不是在所有键上循环但只采用你想要的键

答案 4 :(得分:0)

我会在发电机上调用next,产生你想要的东西;如果生成器耗尽而不产生结果,则可以指定“默认”值:

next((i for i,d in info.items() if d['name'] == 'foo'), 'wrong name')
Out[22]: 1

next((i for i,d in info.items() if d['name'] == 'baz'), 'wrong name')
Out[23]: 'wrong name'

(在这里使用python 3语法,在python 2中使用iteritems而不是items