在字典中获取对应的值
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
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