遍历字典列表,如何根据竞品名称获取对应短名?
问题描述
现有存储快餐信息的字典列表fastfoods,每个字典包含id、name、shortname、competitor字段。需求如下:
- 遍历每个字典,提取竞品名称
- 根据该竞品名称,找到列表中
name字段匹配的字典并获取其shortname
当前实现代码逻辑错误,无法达成目标,示例代码如下:
fastfoods = [{'id': 30, 'name': 'McDonalds', 'shortname': 'MC', 'competitor': 'BurgerKing'}, {'id': 47, 'name': 'BurgerKing', 'shortname': 'BK', 'competitor': None}] for fastfood in fastfoods: competitor_name = fastfood.get('competitor') short_name = fastfood.get('shortname') for fastfood in fastfoods: if competitor_name == short_name: print(fastfood.get('shortname')
以示例第一个字典为例,提取竞品名称'BurgerKing'后,需找到name字段为'BurgerKing'的字典,获取其shortname(即'BK')。实际场景中列表包含数千个字典,需要高效实现。
优化实现方案
直接嵌套循环遍历数千条数据会导致O(n²)的时间复杂度,效率极低。推荐先构建一个name到shortname的映射字典,之后遍历原列表时直接通过映射快速查找,时间复杂度降为O(n)。
步骤1:构建名称映射字典
遍历一次fastfoods,把每个快餐的name作为键,shortname作为值存入字典,后续查找直接通过键取值:
# 构建name到shortname的映射 name_to_shortname = {item['name']: item['shortname'] for item in fastfoods}
步骤2:遍历原列表获取竞品缩写
遍历每个快餐条目,提取competitor名称,再从映射字典中获取对应的shortname:
fastfoods = [{'id': 30, 'name': 'McDonalds', 'shortname': 'MC', 'competitor': 'BurgerKing'}, {'id': 47, 'name': 'BurgerKing', 'shortname': 'BK', 'competitor': None}] # 构建映射字典 name_to_shortname = {item['name']: item['shortname'] for item in fastfoods} # 遍历处理每个快餐的竞品 for food in fastfoods: competitor_name = food.get('competitor') if competitor_name: # 跳过竞品为None的情况 competitor_shortname = name_to_shortname.get(competitor_name) print(f"{food['name']} 的竞品缩写是 {competitor_shortname}")
代码说明
- 映射字典
name_to_shortname只需要构建一次,后续查找都是O(1)的时间开销,适合处理大量数据 - 增加了
if competitor_name:判断,避免竞品为None时出现无效查找 - 输出结果更清晰,明确对应关系
运行示例代码会输出:
McDonalds 的竞品缩写是 BK
内容的提问来源于stack exchange,提问作者Yen
相关产品推荐
相关产品推荐

