首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同代码在CodeSkulptor上的错误答案

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

Stack Overflow用户
提问于 2014-08-10 15:02:44
回答 1查看 855关注 0票数 2

在一个与python中的字典有关的在线课程中,我的一位同事在输出方面遇到了一个错误,但是奇怪的是,同样的代码在空闲时很好地工作,并打印正确的代码。autograger软件支持Python2.7,基于Skulpt和CodeMirror,因此,为了测试这段代码,我使用了CodeSkulptor Viz模式,它输出了错误的答案。为什么会这样?

代码语言:javascript
复制
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打印:

代码语言:javascript
复制
 zqian@umich.edu 4
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-10 16:28:52

问题是Skulpt不是Python的一个完整实现,而且您使用的是它不支持的特性:max-or上的max参数,实际上,任何函数上的任何关键字参数(参见医生们)。

如果对稳定版本进行测试,则会得到一个错误:

代码语言:javascript
复制
Line 41: ValueError: Keyword arguments are not supported by this function

测试版显然增加了对这一特性的支持,但它显然仍然是错误的,这可能就是为什么你得到了错误的答案。我假设他们有一个错误报告系统,所以您可能应该提交一个bug。

但是,除非您想等到Skulpt的下一个版本完成,并推出一个新版本的CodeSkulptor,否则这不会对您有所帮助;您将需要解决缺少的/ But特性。(一定要留下一条评论,提醒自己或其他读者,为什么你需要解决办法。)

正如分类方法所解释的,在排序相关的函数(包括max,即使这并不明显)有一个key参数之前,Python程序员必须执行名为“装饰-排序(或搜索)-undecorate”的操作:创建一个新的序列,您已经(以某种可逆的方式)对其进行了修改,按照所需的顺序排序,然后调用您的函数,然后反转修改。

在您的情况下,您希望按值排序字典。最简单的方法是创建一个(value, key)对列表,以实现可逆的装饰。它的max将是最高值的valuekey,然后要取key。所以:

代码语言:javascript
复制
# 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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25229868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档