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

MapReduce Mapper开发问题:单词首字母为元音时输出1否则输出0

MapReduce Mapper函数问题修复

我正在处理MapReduce问题的第一部分,需要实现一个Mapper函数,要求当单词首字母为元音时输出1,否则输出0。程序通过终端管道运行,命令为cat test.txt | python3 mapper.py。目前前两列输出正常,但第三列(用于标识单词首字母是否为元音)全部显示1,不符合预期。

预期输出

i 1 1 0   
t 1 0 0
s 1 0 0
a 1 1 1
b 1 0 0
e 1 0 0
a 1 0 0
u 1 0 0
t 1 0 0
i 1 0 0  
f 1 0 0
u 1 0 0
l 1 0 0
l 1 0 0
i 1 0 0 
f 1 0 0
e 1 0 1

当前输出

i 1 1 0
t 1 1 0
s 1 1 0
a 1 1 0
b 1 1 0
e 1 1 0
a 1 1 0
u 1 1 0
t 1 1 0
i 1 1 0
f 1 1 0
u 1 1 0
l 1 1 0
l 1 1 0
i 1 1 0
f 1 1 0
e 1 1 0

问题分析

你的代码存在两个核心问题:

  • 丢失单词归属信息:把整行所有字母合并成一个字符串遍历,无法区分每个字母属于哪个单词,自然无法正确判断该字母所属单词的首字母是否为元音。
  • 生成器逻辑错误:first_vowel函数依赖全局的tokens变量,每次调用next(first_vowel())都会重新创建生成器,且每次取的是第一个单词的首元音判断结果,导致所有字母的第三列都复用了第一个单词的结果,最终全为1。

修正后的代码

import sys
import re

# 匹配单个字母字符(忽略大小写)
pattern = re.compile("^[a-z]$", re.IGNORECASE)
# 匹配以元音开头的单词(忽略大小写)
starting_vowels = re.compile("^[aeiou]", re.IGNORECASE)
# 匹配元音字符(忽略大小写)
vowel_chars = re.compile("[aeiou]", re.IGNORECASE)

for line in sys.stdin:
    line = line.strip()
    # 按空格拆分每行的单词
    words = line.split()
    for word in words:
        # 判断当前单词首字母是否为元音
        start_vowel_flag = '1' if starting_vowels.match(word) else '0'
        word_len = len(word)
        for idx, letter in enumerate(word.lower()):
            if pattern.match(letter):
                # 判断当前字母是否是单词最后一个字符且为元音
                end_vowel_flag = '1' if (idx == word_len - 1 and vowel_chars.match(letter)) else '0'
                print(f"{letter} 1 {start_vowel_flag} {end_vowel_flag}")

修正说明

  1. 保留单词归属:遍历每行的每个单词,再遍历单词内的每个字母,确保每个字母都能关联到所属单词的信息。
  2. 首元音判断:对每个单词单独判断首字母是否为元音,得到该单词所有字母共用的首元音标记。
  3. 尾元音判断:对每个字母,判断它是否是所在单词的最后一个字符且为元音,生成对应的标记。
  4. 正则优化:使用re.IGNORECASE简化大小写判断,避免重复写大小写字符集;调整pattern匹配单个字母,判断更精准。

内容的提问来源于stack exchange,提问作者Zaku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:13:17