在与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
答案 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
为最高值的value
和key
,然后您想要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)