Python实现数字与单词互转:能否用单字典并保证列表顺序?
用单个字典实现数字与单词的双向转换 + 解决列表顺序问题
嘿,我来帮你搞定这个问题!你想用单个字典实现数字和单词的双向转换,还遇到了输出列表顺序不对的问题,这两个需求其实都很好解决,咱们一步步来:
一、只用一个字典实现双向转换的两种方法
完全不用维护两个键值对互换的字典,只需要一个核心字典,就能搞定双向转换:
方法1:动态生成反向映射(推荐)
先定义你的核心字典,比如数字到单词的映射:
num_word_map = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', # 这里继续添加你的其他键值对 }
当需要把单词转数字时,用字典推导式临时生成反向映射就行,不用额外存一个新字典:
def word_to_num(words): # 临时生成单词到数字的映射 word_num_map = {word: num for num, word in num_word_map.items()} # 按输入的单词顺序返回对应数字列表 return [word_num_map[word] for word in words]
这样你只需要维护num_word_map这一个字典,反向映射在需要的时候生成,省心又省事。
方法2:直接遍历原字典查找(适合小字典)
如果你的字典键值对不多,也可以直接遍历原字典的键值对来找匹配项,不用生成反向字典:
def word_to_num_single(word): for num, w in num_word_map.items(): if w == word: return num # 找不到的话抛个错误提示 raise ValueError(f"没找到对应的数字:{word}")
这种方法适合字典规模小的场景,不用额外生成字典。
二、解决列表输出顺序不符合预期的问题
你说输出列表顺序不对,大概率是遍历方式或者处理输入的顺序出了问题,分两种常见情况解决:
情况1:按输入数字/单词的顺序输出
如果你的需求是输出顺序和输入顺序完全一致,那只要按输入的顺序逐个处理就行:
- 数字转单词:直接遍历输入的数字列表,用原字典取值,比如:
输入def num_to_word(nums): return [num_word_map[num] for num in nums][2, 0, 1],输出就是['two', 'zero', 'one'],完全跟着输入顺序走。 - 单词转数字:用上面方法1的列表推导式,也是按输入的单词顺序逐个查找,输出顺序自然和输入一致。
情况2:按特定规则排序输出(比如字母顺序、数字大小)
如果你的需求是按特定规则排序(比如按单词的字母顺序输出数字,或者按数字大小输出单词),那可以用sorted()函数加自定义排序规则:
比如按单词的字母顺序排序后输出数字列表:
# 按单词字母顺序排序键值对 sorted_items = sorted(num_word_map.items(), key=lambda x: x[1]) # 提取排序后的数字列表 sorted_nums = [num for num, word in sorted_items] # 提取排序后的单词列表 sorted_words = [word for num, word in sorted_items]
这样就能得到符合你要求的有序列表了。
完整示例代码
num_word_map = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four' } # 数字转单词(按输入顺序输出) def num_to_word(nums): return [num_word_map[num] for num in nums] # 单词转数字(按输入顺序输出) def word_to_num(words): word_num_map = {word: num for num, word in num_word_map.items()} return [word_num_map[word] for word in words] # 测试用例 print(num_to_word([3, 1, 0])) # 输出: ['three', 'one', 'zero'] print(word_to_num(['four', 'two'])) # 输出: [4, 2] # 按单词字母顺序输出数字列表 sorted_by_word = sorted(num_word_map.items(), key=lambda x: x[1]) print([num for num, word in sorted_by_word]) # 输出: [4, 1, 3, 2, 0]
这样既实现了单个字典的双向转换,又能灵活控制输出列表的顺序啦!
内容的提问来源于stack exchange,提问作者Anand.py
相关产品推荐
相关产品推荐

