【发布时间】:2017-03-28 17:32:46
【问题描述】:
我可以使用 Counter.most_common() 功能完成排名/排序,从而避免这一行:d = sorted(d.items(), key=lambda x: (-x[1],x[0]), reverse=False) ??
挑战: 给您一个字符串。该字符串仅包含小写英文字母字符。您的任务是找出字符串中最常见的三个字符。
输出格式: 在单独的行上打印三个最常见的字符及其出现次数。按出现次数的降序对输出进行排序。如果出现次数相同,则按升序对字符进行排序。
在完成此操作时,我使用了 dict、Counter 和 sort 以确保“出现次数相同,按升序对字符进行排序”。内置的 Python sorted 功能确保按计数排序,然后按字母顺序排序。 我很好奇是否有办法覆盖 Counter.most_common() 默认的任意排序/顺序逻辑,因为它似乎在选择前 3 名时忽略了结果的字典顺序。
import sys
from collections import Counter
string = sys.stdin.readline().strip()
d = dict(Counter(string).most_common(3))
d = sorted(d.items(), key=lambda x: (-x[1],x[0]), reverse=False)
for letter, count in d[:3]:
print letter, count
【问题讨论】:
-
Counter可以计算对象,只要它们是可散列的。但是许多对象是不可排序的,因此尝试对它们进行排序通常没有意义。 -
most_common()返回的顺序不是任意的。它按其中项目的计数顺序,从最常见到最少。我想你可能可以monkey patch 模块来改变它,但这似乎是不明智的。 -
doc explicitly says
Counter.most_common()'s tie-breaker order for when counts are equal is arbitrary(抄送:@martineau)。在 cPython 中,它们依赖于原始插入顺序,但不要依赖它,因为它不是定义的行为。正如您所说,如果您想要完全确定的行为,最好进行排序。
标签: python python-2.7 counter