Python3.6+Django2.0中如何用变量作为字典键取值?
解决方案:匹配字典数据并完善value字段
嘿,我来帮你搞定这个问题!首先得提个小提醒:别用dict当变量名哦,这是Python的内置类型,用它当变量名会覆盖掉内置功能,容易出奇怪的问题,我下面改成obj_value_list来演示。
快速修改你的原有循环
如果不想改动太多现有代码,直接在循环里通过data[x]['title']去匹配对应位置的字典项就能拿到值:
# 重命名变量避免冲突 obj_value_list = [ {'object A': '100'}, {'object B': '101'}, {'object C': '102'}, ] data = [ {'title': 'object A', 'description': 'Some Text'}, {'title': 'object B', 'description': 'Some Text'}, {'title': 'object C', 'description': 'Some Text'}, ] output = [] for x in range(0, len(obj_value_list)): current_title = data[x]['title'] j = { 'id': x, 'title': current_title, 'description': data[x]['description'], # 直接用title作为键取对应的值 'value': obj_value_list[x][current_title] } output.append(j)
更稳妥高效的优化方案(推荐)
上面的写法依赖两个列表的顺序完全一致,如果哪天数据顺序变动就会出错。更稳妥的方式是先把obj_value_list转换成一个统一的字典,这样不管顺序如何,都能通过title快速找到对应的值:
obj_value_list = [ {'object A': '100'}, {'object B': '101'}, {'object C': '102'}, ] data = [ {'title': 'object A', 'description': 'Some Text'}, {'title': 'object B', 'description': 'Some Text'}, {'title': 'object C', 'description': 'Some Text'}, ] # 先把分散的小字典合并成一个便于查找的大字典 value_map = {} for item in obj_value_list: # 每个item只有一个键值对,直接取出键和值 key, val = next(iter(item.items())) value_map[key] = val # 用enumerate循环data,写法更Pythonic,不用依赖列表顺序 output = [] for idx, data_item in enumerate(data): j = { 'id': idx, 'title': data_item['title'], 'description': data_item['description'], # 直接通过title从大字典里取值 'value': value_map[data_item['title']] } output.append(j)
为什么推荐第二种方案?
- 不依赖顺序:哪怕
obj_value_list的顺序被打乱,只要键和data里的title对应,就能正确取值 - 效率更高:尤其是数据量大的时候,第一种是线性查找,第二种预处理后每次查找都是O(1)的常数时间
- 更Pythonic:用
enumerate代替range(len()),代码更简洁易读
内容的提问来源于stack exchange,提问作者Jokz
相关产品推荐
相关产品推荐

