在字典/列表中迭代的Python新手请耐心听我说:
字典列表:
l =
[{'id': 1, 'name': 'cream'},
{'id': 2, 'name': 'sugar'},
{'id': 3, 'name': 'mint'}]
根据名称的值,我想从列表中选择相应的id值。
例如,如果我选择"cream",我想要1。"Sugar"我想要2,等等,等等
简单的方法做到这一点,最好是通过列表理解?
我可能没有完整的图片,但我在你的问题中看不到实际上需要字典列表。事实上,你所拥有的结构允许一个条目有多个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]
如果我没理解错的话,你可能想这样做:
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)
这将是相应的列表推导式。我不认为理解是最好的方法,因为你不想要一个列表,但你要求它。
列表推导似乎不是这样做的合适方式,但我已经创建了一些使用它的代码,因为这是您所要求的:
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