在字典中获取对应的值

Get Corresponding Value in Dictionary

Python 努力迭代 dictionaries/lists 的菜鸟所以请耐心等待:

词典列表:

l = 
[{'id': 1, 'name': 'cream'},
{'id': 2, 'name': 'sugar'},
{'id': 3, 'name': 'mint'}]

根据name的值,我想select从列表中取对应id的值

比如我select“奶油”我要1个“糖”我要2个等等

最好通过列表理解来实现此目的的简单方法?

如果我没理解错的话,你可能想做:

def selection(list_of_dicts, name_value):
    for d in list_of_dicts:
        if d["name"] == name_value:
            return d["id"]
l = [{'id': 1, 'name': 'cream'},
     {'id': 2, 'name': 'sugar'},
     {'id': 3, 'name': 'mint'}]


input_name = input("name?")

result = [x["id"] for x in l if input_name == x["name"]]
print(result)

这将是相应的列表理解。我不认为推导式是执行此操作的最佳方式,因为您不需要列表,但您请求了它。

我可能没有 完整 图片,但我在您的问题中看不到任何实际上 需要 词典列表的内容。事实上,您拥有的结构允许一个项目具有 多个 ID:

myList = [
    { 'id':   1, 'name': 'cream' },
    { 'id':   2, 'name': 'sugar' },   # duplicates
    { 'id': 999, 'name': 'sugar' },   #   here.
    { 'id':   3, 'name': 'mint'  }
]

如果您需要做的只是将字符串映射到标识符,单个 字典就可以做到:

lookup = {'cream': 1, 'sugar': 2, 'mint': 3}

那你就可以用lookup['cream']来翻译了。


如果您确实需要您指定的特定数据结构,您可以使用类似的东西:

[aDict['id'] for aDict in myList if aDict['name'] == 'cream']

获取匹配项列表,如果有多个匹配项,您需要决定要做什么,例如只获取第一个匹配项:

def getIdFor(haystack, needle):
    matches = [aDict['id'] for aDict in haystack if aDict['name'] == needle]
    if len(matches) == 0: return None
    return matches[0]

感觉列表理解不是执行此操作的合适方法,但我创建了一些使用它的代码,因为这正是您所要求的:

l = [{'id': 1, 'name': 'cream'},
{'id': 2, 'name': 'sugar'},
{'id': 3, 'name': 'mint'}]

def get_id(l, name):
  new_list = [item for item in l if item['name'] == name]
  if len(new_list) == 0:
    return None
  return new_list[0].get('id')

print(get_id(l, 'cream'))

输出

1

如果与查找操作相比,源数据的修改很少见,那么生成一个包含您正在寻找的精确映射的新字典是有意义的,以避免在每次查找时进行全面扫描:

l = 
[{'id': 1, 'name': 'cream'},
{'id': 2, 'name': 'sugar'},
{'id': 3, 'name': 'mint'}]

remapped = {item['name']:item['id'] for item in l}
# then
remapped['cream'] # -> 1
remapped['suger'] # -> 2