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

如何高效找出多字符串各位置最频字符并避免索引越界

解决单词列表各位置最高频字符问题

问题描述

给定一个长度不一的单词列表,需要找出每个位置上出现频率最高的字符;同时要避免因单词长度不同导致的索引越界错误;如果有多个字符频率相同,选字母表中排序靠前的那个。

示例输入:

alist = ['fowey', 'tynemouth', 'unfortunates', 'patroness', 'puttying', 'presumptuousness', 'lustrous', 'gloxinia']

预期输出:poternusakesness


实现方案

1. 高效实现思路

核心就是按位置逐个处理:

  • 先找出列表里最长单词的长度,这就是需要遍历的位置总数
  • 对每个位置,收集所有长度足够的单词在该位置的字符
  • 统计字符频率,选出符合要求的字符(频率最高,同频选字母序靠前的)

2. 避免索引越界的方法

遍历每个位置pos时,只筛选出长度大于pos的单词,再取它的第pos个字符。简单说就是加判断:len(word) > pos,这样就不会去访问单词里不存在的索引了。

3. 同频字符的处理逻辑

当多个字符频率相同时,要选字母表靠前的,所以排序时先按频率降序排列,频率相同的再按字符本身升序排列,排在最前面的就是符合要求的字符。


完整代码示例

from collections import Counter

alist = ['fowey', 'tynemouth', 'unfortunates', 'patroness', 'puttying', 'presumptuousness', 'lustrous', 'gloxinia']

# 获取最长单词的长度
max_length = max(len(word) for word in alist)
result_chars = []

for pos in range(max_length):
    # 收集当前位置的所有有效字符
    current_chars = [word[pos] for word in alist if len(word) > pos]
    # 统计字符出现次数
    char_counts = Counter(current_chars)
    # 按规则排序:频率从高到低,同频则字母从小到大
    sorted_chars = sorted(char_counts.items(), key=lambda item: (-item[1], item[0]))
    # 取第一个字符加入结果
    result_chars.append(sorted_chars[0][0])

# 拼接成最终字符串
final_result = ''.join(result_chars)
print(final_result)  # 输出: poternusakesness

代码关键点说明

  • 用collections.Counter统计字符频率,这是Python内置的高效统计工具,比手动循环计数更简洁高效
  • 列表推导式里的len(word) > pos直接过滤短单词,从根源避免了索引越界问题
  • 排序时用(-item[1], item[0])作为key,负号让频率高的字符靠前,item[0]确保同频时字母序小的优先

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:45:57