嵌套字典遍历问题:高效搜索商品并计算均价的代码优化
问题修复与优化方案
问题分析
- 低效搜索与重复计数:原代码遍历每个字典的所有键值对,若单个字典内多个值匹配搜索词,会重复累加价格和计数,导致结果错误。
- 错误的提示输出:修改后的代码在每个不匹配的键值对都打印“not in list”,导致大量重复输出,而非在完全无匹配时仅提示一次。
- 实时打印不符合需求:每次匹配就打印结果,不符合“不在迭代中打印”的要求。
优化后的代码
# 假设原始数据列表为l l = [ {'id': 2, 'name': 'apple', 'price': '150', 'year': '2022', 'currency': 'eur'}, {'id': 3, 'name': 'apple', 'price': '1220', 'year': '160', 'currency': 'eur'}, {'id': 4, 'name': 'apple', 'price': '150', 'year': '2080', 'currency': 'eur'} ] total = 0 count = 0 matched_products = [] # 收集匹配的产品信息 product_search = input('product: ') for d in l: # 检查当前字典是否包含搜索词(任意字段匹配) if product_search in d.values(): price = int(d['price']) total += price count += 1 matched_products.append((d['name'], price)) # 统一打印匹配结果 if matched_products: for name, price in matched_products: print(name, price) print(f'average price of a {matched_products[0][0]} is: {total / count:.2f}') else: print('not in list')
代码说明
- 高效匹配:直接检查字典的所有值是否包含搜索词,避免嵌套遍历每个键值对,同时确保单个字典仅被计数一次。
- 结果收集后统一输出:用列表
matched_products存储所有匹配项,遍历结束后再统一打印,符合“不在迭代中打印”的需求。 - 正确的提示逻辑:仅在完全没有匹配产品时,才打印一次“not in list”,避免重复输出。
- 格式化平均价格:用
:.2f保留两位小数,让结果更直观。
可选优化:仅按产品名称搜索
如果你的需求是仅匹配产品名称(而非任意字段),可以进一步提升效率,直接判断d['name']是否等于搜索词,无需遍历所有值:
# 仅按名称搜索的优化版本 total = 0 count = 0 matched_products = [] product_search = input('product: ') for d in l: if d['name'] == product_search: price = int(d['price']) total += price count += 1 matched_products.append((d['name'], price)) if matched_products: for name, price in matched_products: print(name, price) print(f'average price of a {product_search} is: {total / count:.2f}') else: print('not in list')
内容的提问来源于stack exchange,提问作者curlyfries98
相关产品推荐
相关产品推荐

