如何将统计邮件大写词的双层for循环合并为列表推导式?
把双层循环转为列表推导式的方案
嘿,我来帮你把这段双层循环重构为更简洁的列表推导式!先理清楚你的原函数逻辑:你要遍历每一组邮件线程(data里的每个元素),统计每个线程内的大写相关数量(要么是所有单词里的大写字母总数,要么是全大写的单词数),最后把每个线程的统计结果汇总成列表返回。
情况1:统计每个线程中所有单词的大写字母总数
如果你的原代码是统计每个单词里的大写字母,再累加每个线程的总数,那可以直接把两层循环合并成下面的列表推导式:
def get_capital_prop(data): return [sum(sum(1 for c in word if c.isupper()) for word in thread) for thread in data]
这里的思路很清晰:
- 外层直接遍历
data里的每个邮件线程thread,代替原代码里for i in range(len(data))这种不够直观的索引遍历 - 内层对线程里的每个
word,统计其中大写字母的数量,再把这些数值求和,得到当前线程的总大写字母数 - 整个表达式直接生成最终的结果列表,省去了原代码里的临时变量
count和手动append操作
情况2:统计每个线程中全大写的单词数量
如果你的需求是统计每个线程里全大写的单词(比如"THIS"这种,而非"This"),那推导式会更简洁:
def get_capital_prop(data): return [sum(1 for word in thread if word.isupper()) for thread in data]
这个写法直接对每个线程里的单词做判断,统计符合全大写条件的单词数量,一步生成结果列表。
额外优化提示
原代码里的temp变量看起来没有被用到,可以直接删掉,避免冗余。另外,用直接遍历元素的方式代替索引遍历,会让代码更易读也更符合Python的惯用风格。
内容的提问来源于stack exchange,提问作者veridian
相关产品推荐
相关产品推荐

