You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用字母列表获取嵌套字典中对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:05:02