Python高效计算等长单词列表各位置字符频率的最优方案
高效计算固定长度单词列表的位置字符频率数组
嘿,这个需求其实很好实现,而且能做到最优效率——毕竟咱们得遍历每个位置的所有字符,这是无法避免的最小工作量,不过用Python的内置工具能把这个过程变得简洁又高效。
核心思路
- 按位置拆分字符:因为所有单词长度一致,我们可以逐个处理每个位置(比如第0位、第1位...),收集所有单词在该位置的字符。
- 统计频率:用
collections.Counter来快速统计每个字符的出现次数,它底层是哈希表实现,统计效率很高。 - 排序整理格式:把统计结果转换成你需要的字典格式,然后按频率降序排序;如果频率相同,就按字符升序排列(和你给出的示例逻辑一致,比如第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
相关产品推荐
相关产品推荐

