我正在尝试创建一个函数,该函数返回字典中具有最高值的键列表,限于限定范围内。我不明白为什么以下代码生成的列表长于定义的范围...
我是一个自学的python新手。我曾尝试浏览其他SO帮助页面,但发现没有任何帮助。我试图调整下面的代码中的内容,可能会完全想到另一种方法,但是我只是不明白为什么不起作用?
def foo(somedict, number):
mylist = somedict.values()
for x in range(number):
for letter in somedict:
if somedict[letter] == max(mylist):
print letter
mylist.remove(max(mylist))
我希望文件的长度(数字)-在上面的示例中为3,但更长-至少为5。
mydict = {"a":1,"b":2,"c":3,"d":4}
>>> foo(mydict,3)
d
c
b
a
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
foo(mydict,3)
File "<pyshell#11>", line 5, in foo
if somedict[letter] == max(mylist):
ValueError: max() arg is an empty sequence
答案 0 :(得分:0)
临时调试将显示此问题。插入print
以跟踪您的值:
def foo(somedict, number):
mylist = somedict.values()
for x in range(number):
for letter in somedict:
print x, letter, mylist
if somedict[letter] == max(mylist):
print letter
mylist.remove(max(mylist))
mydict = {"a":1,"b":2,"c":3,"d":4}
foo(mydict, 3)
输出:
0 a [1, 3, 2, 4]
0 c [1, 3, 2, 4]
0 b [1, 3, 2, 4]
0 d [1, 3, 2, 4]
d
1 a [1, 3, 2]
1 c [1, 3, 2]
c
1 b [1, 2]
b
1 d [1]
2 a [1]
a
2 c []
Traceback (most recent call last):
File "so.py", line 11, in <module>
foo(mydict, 3)
File "so.py", line 6, in foo
if somedict[letter] == max(mylist):
ValueError: max() arg is an empty sequence
您系统地从列表中删除了每个值。最终,您有一个空列表,这将导致max
失败。
由于您没有告诉我们您要完成的工作,因此我们无法“修复”代码。
答案 1 :(得分:0)
我认为您应该这样做:
somedict.pop(字母,无)
但是我们会得到
RuntimeError:字典在迭代过程中更改了大小
因为我们在迭代字典时会不断更改字典。您可以为要删除的每个键分配一个“无”,然后通过另一次迭代即可获得所需的内容。
PS:尝试一下也很好,除了带有适当的错误消息。