在for循环中迭代字典太多次了?

时间:2019-05-16 16:02:57

标签: python

我正在尝试创建一个函数,该函数返回字典中具有最高值的键列表,限于限定范围内。我不明白为什么以下代码生成的列表长于定义的范围...

我是一个自学的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

2 个答案:

答案 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:尝试一下也很好,除了带有适当的错误消息。