【发布时间】:2017-11-03 09:10:45
【问题描述】:
我正在为 Python 3 学习在 Hackerrank 中做一些练习。
在任务Most Common 中,你得到一个只包含小写英文字符的字符串,你需要找到该字符串中最常见的三个字符。
我遇到了一些问题。
我对这个问题的解决方案如下:
#!/bin/python3
import sys
if __name__ == "__main__":
s = input().strip()
ch_dict = {}
for ch in s:
if ch in ch_dict : ch_dict[ch] +=1
else: ch_dict[ch] = 1
result = sorted(ch_dict.items(),key=lambda d:d[1],reverse=True)
for i in result:
if i[1] != 1:
print(" ".join(map(str,i)))
当我在本地环境中测试这段代码时,它可以工作!
但是在在线测试中,它可能会失败!
对于这个输入:
aabbbccde
我提交了很多次,有时会得到这样的正确答案:
b 3
a 2
c 2
也可以得到这个:
b 3
c 2
a 2
似乎排序可能不稳定?或者我的代码有什么问题?或者在 Hackerrank 环境中有什么问题吗?
我如何保证我的输出?
【问题讨论】:
-
字典是无序的,你只对值进行排序。所以当你得到相等的值时,它们的顺序和输入的顺序是一样的。哪个是实现定义的,看起来可能是任意的。见Why is the order in dictionaries and sets arbitrary?
-
第二个答案和第一个答案一样正确,都是按值排序的。稳定和不稳定在这里不适用,因为没有以前的订单要保留。
-
@Goyo:嗯,有,但是由于随机哈希种子,这个顺序会改变解释器的每次新调用。
-
@MartijnPieters 我的意思是代码没有定义订单。但你是对的,在特定的执行中会有一个顺序,在某些情况下稳定性很重要。
-
Hackerrank 任务描述还包括一个你可能忽略的规范:“如果出现次数相同,则按升序对字符进行排序。”
标签: python sorting dictionary