CodeSkulptor中相同代码得到错误答案

2 投票
1 回答
871 浏览
提问于 2025-04-18 16:44

在一次在线课程的作业中,我的一个同事在使用Python的字典时遇到了输出错误。不过奇怪的是,同样的代码在IDLE上运行得很好,能正确打印结果。这个自动评分软件支持Python 2.7,并且是基于Skulpt和CodeMirror的。为了测试这段代码,我使用了CodeSkulptor的可视化模式,但它打印出的结果不正确。为什么会这样呢?

handle = [ "From stephen.marquard@uct.ac.za",
"From louis@media.berkeley.edu",
"From zqian@umich.edu",
"From rjlowe@iupui.edu",
"From zqian@umich.edu",
"From rjlowe@iupui.edu",
"From cwen@iupui.edu",
"From cwen@iupui.edu",
"From gsilver@umich.edu",
"From gsilver@umich.edu",
"From zqian@umich.edu",
"From gsilver@umich.edu",
"From wagnermr@iupui.edu",
"From zqian@umich.edu",
"From antranig@caret.cam.ac.uk",
"From gopal.ramasammycook@gmail.com",
"From david.horwitz@uct.ac.za",
"From david.horwitz@uct.ac.za",
"From david.horwitz@uct.ac.za",
"From david.horwitz@uct.ac.za",
"From stephen.marquard@uct.ac.za",
"From louis@media.berkeley.edu",
"From louis@media.berkeley.edu",
"From ray@media.berkeley.edu",
"From cwen@iupui.edu",
"From cwen@iupui.edu",
"From cwen@iupui.edu",
    ]

answer_key = 0

dct = dict()
for line in handle:
    if line.startswith('From '):
        email = line.strip().split()[1]
        if not email in dct:
            dct[email] = 1
        else:
            dct[email] += 1

answer_key = max(dct, key=dct.get)
print answer_key, dct[answer_key]  

正确的输出应该是:
cwen@iupui.edu 5

但是CodeSkulptor打印的是:
zqian@umich.edu 4

1 个回答

2

问题在于,Skulpt并不是一个完整的Python实现,你正在使用它不支持的功能:在max函数中使用key参数——实际上,任何函数都不支持关键字参数(具体可以查看文档)。

如果你在稳定版本中尝试这个,会出现错误:

Line 41: ValueError: Keyword arguments are not supported by this function

测试版似乎增加了对这个功能的支持,但看起来仍然有一些bug,这可能就是你得到错误答案的原因。我猜他们有一个bug报告系统,所以你可能需要提交一个bug报告。

不过,除非你想等到下一个版本的Skulpt完成,以及新的CodeSkulptor发布,否则这对你没有帮助;你需要找到一种方法来绕过这个缺失或有问题的功能。(并且记得留个评论,提醒自己或其他读者为什么需要这个解决方法。)

正如排序指南所解释的,在与排序相关的函数(包括max,即使这不明显)有key参数之前,Python程序员需要做一种叫“装饰-排序(或搜索)-去装饰”的操作:创建一个你修改过的新序列(以某种可逆的方式)来按所需顺序排序,然后调用你的函数,最后再反转修改。

在你的情况下,你想按值的顺序对字典进行排序。最简单的可逆装饰方法是创建一个(value, key)对的列表。这个列表中的max将是最高值的valuekey,然后你只需要取出key。所以:

# Skulpt can't handle key arguments on max, so we have to
# decorate-search-undecorate instead.
deco = [(v, k) for (k, v) in dct.items()]
_, answer_key = max(deco)

撰写回答