如何在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
相关产品推荐
相关产品推荐

