在CodeSkulptor上获取相同代码的错误答案

时间:2014-08-10 15:02:44

标签: python

在与python中的字典相关的分配期间的一个在线课程中,我的一位同事在输出中遇到了错误,但奇怪的是相同的代码在IDLE上工作正常并打印正确的代码.. autograger软件支持Python 2.7并且是基于Skulpt和CodeMirror所以只是为了测试这段代码,我使用CodeSkulptor Viz模式打印错误的答案。为什么这个Hapenning?

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

但CodeSculptor打印:
    zqian@umich.edu 4

1 个答案:

答案 0 :(得分:2)

问题在于,Skulpt不是Python的完整实现,并且您正在使用它不支持的功能:key上的max个参数 - 或者,事实上,任何函数上的任何关键字参数(参见the docs)。

如果您针对稳定版本进行尝试,则会收到错误消息:

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

测试版显然已经添加了对此功能的支持,但它显然仍然是错误的,这可能是你得到错误答案的原因。我假设他们有一个错误报告系统,所以你应该提交一个bug。

但除非您想等到Skulpt的下一个版本完成,并且推出了新版本的CodeSkulptor,否则不会对您有所帮助;你需要解决缺失/错误的功能。 (并确保留下评论提醒自己或其他读者,为什么需要解决方法。)

正如Sorting HOWTO所解释的那样,在排序相关函数(包括max之前,即使不是很明显)之前有一个key参数,Python程序员必须做一些事情调用"装饰 - 排序(或搜索)-undecorate":创建一个你修改过的新序列(以某种可逆的方式)按所需顺序排序,然后调用你的函数,然后反转修改

在您的情况下,您希望按值顺序对字典进行排序。可逆地装饰的最简单方法是创建(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)