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

如何在Python中使用Counter实现有序输出的字谜分组程序?

解决用Counter实现变位词分组的问题

你的代码无法正确分组变位词,核心问题在于Counter的items()返回的键值对顺序不固定。即使是变位词(比如"eat"和"tea"),它们的Counter对象生成的items()元组顺序可能不同,导致无法被识别为同一个键,进而无法分到同一组。

举个例子:

  • "eat"的Counter(i).items()可能是(('e', 1), ('a', 1), ('t', 1))
  • "tea"的Counter(i).items()可能是(('t', 1), ('e', 1), ('a', 1))
    这两个元组不相等,所以会被当成不同的键存入defaultdict,最终无法完成正确分组。

下面提供两种可行的解决方案:

方案1:对Counter的键值对排序后生成键

把Counter的items()按字符排序后转成元组,这样无论变位词的字符顺序如何,生成的键都是一致的:

from collections import Counter, defaultdict  
def checking_anagram(keywords):  
    agrms = defaultdict(list)  
    for i in keywords:  
        # 对Counter的键值对按字符排序,生成固定顺序的元组
        hist = tuple(sorted(Counter(i).items()))  
        agrms[hist].append(i)  
    return list(agrms.values())  
keywords = ("eat","tea","tan","ate","nat","bat","bat")  
print(checking_anagram(keywords)) 

方案2:直接排序字符串生成键(更简洁高效)

对于变位词来说,排序后的字符串完全相同,这种方法比用Counter更简洁,性能也更优:

from collections import defaultdict  
def checking_anagram(keywords):  
    agrms = defaultdict(list)  
    for i in keywords:  
        # 排序字符串后转成元组(或直接用字符串)作为键
        sorted_key = tuple(sorted(i))  
        # 也可以替换为 ''.join(sorted(i)) 作为键
        agrms[sorted_key].append(i)  
    return list(agrms.values())  
keywords = ("eat","tea","tan","ate","nat","bat","bat")  
print(checking_anagram(keywords)) 

两种方案运行后都会输出正确的分组结果:
[['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat', 'bat']]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:21:37