对不起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"
答案 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)
ie_info
与全局变量info
不匹配。id
:v['id']
id
引用id
function。name
键值。
dict['name']
,dict['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():
... 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