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

Python高效计算等长单词列表各位置字符频率的最优方案

高效计算固定长度单词列表的位置字符频率数组

嘿,这个需求其实很好实现,而且能做到最优效率——毕竟咱们得遍历每个位置的所有字符,这是无法避免的最小工作量,不过用Python的内置工具能把这个过程变得简洁又高效。

核心思路

  1. 按位置拆分字符:因为所有单词长度一致,我们可以逐个处理每个位置(比如第0位、第1位...),收集所有单词在该位置的字符。
  2. 统计频率:用collections.Counter来快速统计每个字符的出现次数,它底层是哈希表实现,统计效率很高。
  3. 排序整理格式:把统计结果转换成你需要的字典格式,然后按频率降序排序;如果频率相同,就按字符升序排列(和你给出的示例逻辑一致,比如第3位的'd'和'f'频率都是2,'d'排在前面)。

代码实现

from collections import Counter

words = ['axcd', 'abcd', 'abef', 'abxf']

def calculate_position_char_freq(words):
    if not words:
        return []
    # 所有单词长度一致,取第一个单词的长度作为总位置数
    position_count = len(words[0])
    result = []
    
    for i in range(position_count):
        # 收集当前位置的所有字符
        current_chars = [word[i] for word in words]
        # 统计字符频率
        freq_counter = Counter(current_chars)
        # 转换成要求的字典格式,并排序:先按频率降序,再按字符升序
        sorted_freq = sorted(
            [{'char': char, 'freq': freq} for char, freq in freq_counter.items()],
            key=lambda x: (-x['freq'], x['char'])
        )
        result.append(sorted_freq)
    
    return result

# 测试运行
result = calculate_position_char_freq(words)
print(result)

运行结果

输出完全符合你给出的示例:

[
    [{'char': 'a', 'freq': 4}],
    [{'char': 'b', 'freq': 3}, {'char': 'x', 'freq': 1}],
    [{'char': 'c', 'freq': 2}, {'char': 'e', 'freq': 1}, {'char': 'x', 'freq': 1}],
    [{'char': 'd', 'freq': 2}, {'char': 'f', 'freq': 2}]
]

效率说明

这个方案的时间复杂度是O(n*m),其中n是单词的长度,m是单词的数量。这是理论上的最优复杂度——因为我们必须遍历每个单词的每个字符一次,没有办法再优化了。而Counter的哈希表操作是O(1)平均时间复杂度,所以整体效率非常高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:53