gpt4 book ai didi

python - Counter.most_common(n) 如何覆盖任意排序

转载 作者:太空狗 更新时间:2023-10-30 01:05:41 24 4
gpt4 key购买 nike

我能否使用 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

最佳答案

doc explicitly says Counter.most_common()'s (tie-breaker) order for when counts are equal is arbitrary .

  • 更新:PM2Ring 告诉我 Counter 继承了 dict 的顺序。插入顺序的事情只发生在 3.6+ 中,并且只在 3.7 中得到保证。文档可能滞后。
  • 在 cPython 3.6+ 中,它们返回原始插入顺序(见底部),但不依赖于该实现,因为根据规范,它不是定义的行为。如您所说,如果您想要完全确定的行为,最好按照您自己的方式进行排序。
  • 我在底部展示了你如何做到monkey-patch Counter.most_common 具有您自己的排序功能 就像您展示的那样,但这是不受欢迎的。 (您编写的代码可能会不小心依赖它,因此在未打补丁时会中断。)
  • 您可以将 Counter 子类化为 MyCounter,这样您就可以覆盖它的 most_common。痛苦且不便携。
  • 真正最好的方法就是编写不依赖于 most_common()
  • 的任意决胜顺序的代码和测试
  • 我同意 most_common() 不应该是硬连线的,我们应该能够将比较键或排序函数传递到 __init__() 中。

猴子补丁 Counter.most_common() :

def patched_most_common(self):
return sorted(self.items(), key=lambda x: (-x[1],x[0]))

collections.Counter.most_common = patched_most_common

collections.Counter('ccbaab')
Counter({'a': 2, 'b': 2, 'c': 2})

演示在cPython 3.7中,任意顺序为插入顺序(每个字符先插入):

Counter('abccba').most_common()
[('a', 2), ('b', 2), ('c', 2)]

Counter('ccbaab').most_common()
[('c', 2), ('b', 2), ('a', 2)]

关于python - Counter.most_common(n) 如何覆盖任意排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43076195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com