如何计算嵌套字典中各书籍非零评分的总和与平均值?
解决每本书非零评分总和与平均值计算问题
我来帮你搞定这个问题~你的代码核心问题是没有针对每本书单独统计非零评分的数量,用了一个全局的count变量,导致所有书的有效评分都混在一起,自然没法算出每本书的正确平均值。另外内层遍历books的循环也是多余的,咱们一步步修正:
先看你的原始代码问题点
books = ['book1', 'book2', 'book3'] biglist = [{'user1' : {'book1' : 0, 'book2' : -2, 'book3' : 3}}, {'user2' : {'book1' : 5, 'book2' : 0, 'book3' : -3}}, {'user3' : {'book1' : 1, 'book2' : 5, 'book3' : 3}}] total = dict() count = 0 for list_item in biglist: for key, value in list_item.items(): for key2, value2 in value.items(): total[key2] = value2 + total.get(key2,0) for book in books: if value2 != 0 and book == key2: count += 1 print(f"Found non-zero value, [{key2} : {value2}]")
count是全局变量,所有书的非零评分都累加在这里,无法区分每本书的有效评分数量- 内层遍历
books完全多余,key2本身就是当前处理的书名,直接判断value2 !=0即可
修正后的代码
我们需要用两个字典分别记录每本书的非零评分总和、有效评分数量,这样每本书的数据是独立的:
books = ['book1', 'book2', 'book3'] biglist = [{'user1' : {'book1' : 0, 'book2' : -2, 'book3' : 3}}, {'user2' : {'book1' : 5, 'book2' : 0, 'book3' : -3}}, {'user3' : {'book1' : 1, 'book2' : 5, 'book3' : 3}}] # 初始化两个字典,分别存每本书的非零评分总和、有效评分数量 total_non_zero = {book: 0 for book in books} count_non_zero = {book: 0 for book in books} for user_dict in biglist: # 遍历每个用户的评分字典,用_代替不需要的user变量 for _, ratings in user_dict.items(): for book, score in ratings.items(): if score != 0: total_non_zero[book] += score count_non_zero[book] += 1 print(f"Found non-zero value, [{book} : {score}]") # 计算每本书的平均值,处理无有效评分的情况 book_averages = {} for book in books: if count_non_zero[book] > 0: book_averages[book] = round(total_non_zero[book] / count_non_zero[book], 2) # 保留两位小数 else: book_averages[book] = None # 无有效评分时设为None,也可按需设为0 print("\n=== 统计结果 ===") print("每本书非零评分总和:", total_non_zero) print("每本书非零评分数量:", count_non_zero) print("每本书非零评分平均值:", book_averages)
修正说明
- 用
total_non_zero和count_non_zero两个字典,分别对应每本书的非零评分总和、有效评分次数,确保每本书的数据独立统计 - 去掉了多余的
books循环,直接针对当前遍历到的book进行判断和更新 - 计算平均值时加入了除数为0的判断,避免报错,同时可以按需处理无有效评分的情况(比如设为
None或0) - 用
_代替了不需要的user变量,让代码更简洁
运行这段代码后,你就能得到每本书正确的非零评分总和、数量以及平均值啦~
内容的提问来源于stack exchange,提问作者Jana
相关产品推荐
相关产品推荐

