如何利用字母列表获取嵌套字典中对应的point_value值?
问题描述
我有如下嵌套字典:
{1: {'letter': 'A', 'is_vowel': True, 'point_value': 1}, 2: {'letter': 'B', 'is_vowel': False, 'point_value': 3}, 3: {'letter': 'C', 'is_vowel': False, 'point_value': 3}, 4: {'letter': 'D', 'is_vowel': False, 'point_value': 2}, 5: {'letter': 'E', 'is_vowel': True, 'point_value': 1}, 6: {'letter': 'F', 'is_vowel': False, 'point_value': 4}, 7: {'letter': 'G', 'is_vowel': False, 'point_value': 2}, 8: {'letter': 'H', 'is_vowel': False, 'point_value': 4}, 9: {'letter': 'I', 'is_vowel': True, 'point_value': 1}, 10: {'letter': 'J', 'is_vowel': False, 'point_value': 8}, 11: {'letter': 'K', 'is_vowel': False, 'point_value': 5}, 12: {'letter': 'L', 'is_vowel': False, 'point_value': 1}, 13: {'letter': 'M', 'is_vowel': False, 'point_value': 3}, 14: {'letter': 'N', 'is_vowel': False, 'point_value': 1}, 15: {'letter': 'O', 'is_vowel': True, 'point_value': 1}, 16: {'letter': 'P', 'is_vowel': False, 'point_value': 3}, 17: {'letter': 'Q', 'is_vowel': False, 'point_value': 10}, 18: {'letter': 'R', 'is_vowel': False, 'point_value': 1}, 19: {'letter': 'S', 'is_vowel': False, 'point_value': 1}, 20: {'letter': 'T', 'is_vowel': False, 'point_value': 1}, 21: {'letter': 'U', 'is_vowel': True, 'point_value': 1}, 22: {'letter': 'V', 'is_vowel': False, 'point_value': 4}, 23: {'letter': 'W', 'is_vowel': False, 'point_value': 4}, 24: {'letter': 'X', 'is_vowel': False, 'point_value': 8}, 25: {'letter': 'Y', 'is_vowel': False, 'point_value': 4}, 26: {'letter': 'Z', 'is_vowel': False, 'point_value': 10} }
给定一个随机字母列表,例如:
['I', 'O', 'N', 'V', 'X', 'V', 'H', 'L', 'O', 'N', 'P', 'A', 'L', 'R', 'G', 'G', 'N', 'K', 'W', 'L', 'I', 'P', 'R', 'X', 'R', 'A']
需要生成一个新列表,包含字典中每个字母对应的point_value。
我尝试写了一个函数:
def point_value_rand_letters(list, dic): point_values = [] for letter in list: value = {i for i in dic if dic[i]['letter']==letter} point_values.append(value) print(point_values) return point_values
但返回的是集合形式的键,比如[{12}, {19}, {20}, ...],想知道是要把集合转成整数再取point_value,还是有更简便的实现方式?
解决方案
方法一:优化原函数直接取值
你的代码拿到了字母对应的键,但其实可以直接在遍历过程中取出point_value,不用绕集合:
def point_value_rand_letters(letter_list, dic): point_values = [] for letter in letter_list: for key in dic: if dic[key]['letter'] == letter: point_values.append(dic[key]['point_value']) break # 找到对应字母就停止遍历,提升效率 print(point_values) return point_values
也可以用列表推导式简化成一行:
def point_value_rand_letters(letter_list, dic): point_values = [dic[key]['point_value'] for key in dic for letter in letter_list if dic[key]['letter'] == letter] print(point_values) return point_values
方法二:预构建字母-分数映射(高效首选)
如果需要多次调用这个功能,建议先把原字典转换成字母为键、分数为值的新字典,后续查找就是O(1)的时间复杂度,速度快很多:
# 提前构建映射字典 letter_to_points = {v['letter']: v['point_value'] for v in original_dict.values()} # 生成分数列表的函数 def point_value_rand_letters(letter_list): point_values = [letter_to_points[letter] for letter in letter_list] print(point_values) return point_values
调用时只需要传入字母列表即可,尤其适合处理长列表的场景。
基于原代码的修改
如果一定要沿用你原有的思路,只需把集合里的唯一键取出来再取值:
def point_value_rand_letters(letter_list, dic): point_values = [] for letter in letter_list: # 每个字母对应唯一键,用next()直接取出生成器里的第一个元素 key = next(i for i in dic if dic[i]['letter'] == letter) point_values.append(dic[key]['point_value']) print(point_values) return point_values
内容的提问来源于stack exchange,提问作者astro20
相关产品推荐
相关产品推荐

