神秘的KeyError

时间:2012-11-18 05:09:25

标签: python

我正在研究我的CS测试,并试图编写代码,给定整个IMDB数据库的明文,找到最常见的电影的演员。我已经完成了,我只是一直在遇到一个奇怪的KeyError。这是我的代码:

enter image description here

我遇到的问题是,当我运行它时,它会在运行突出显示的代码时产生一个keyerror。我已经验证它确实正在使用字符串索引字典,并且该密钥在字典中,但它仍然无效。有什么想法吗?

4 个答案:

答案 0 :(得分:8)

执行other_people = people_and_their_movies时,您不会复制。您将other_people指向people_and_their_movies指向的同一对象。因此,当您执行del other_people[actor1]时,您将从两个 dicts中删除该actor(因为它们是相同的)。

相反,请other_people = people_and_their_movies.copy()

(顺便说一句,在StackOverflow上,最好将实际代码复制并粘贴为文本而不是屏幕截图。这样人们就可以剪切和粘贴代码并自行尝试找出它的错误。)

答案 1 :(得分:2)

问题在于这行代码:

other_people = people_and_their_movies

这不是创建字典的副本。相反,这两个变量都指向内存中的同一个字典。因此,当您执行此行时:

del other_people[actor1]

您正在从people_and_their_movies指向的同一字典中删除actor1。

你可以试试这个:

other_people = people_and_their_movies.copy()

答案 2 :(得分:1)

之前你分配

other_people = people_and_their_movies

所以当你

del other_people[actor1]

你实际上是从这两个词中删除了那个键。此时other_peoplepeople_and_their_movies指向同一个对象。

查看python的copy模块,了解制作dict的真实副本的方法,这样你就可以安全地将它们分离并从两个中只删除其中一个。

答案 3 :(得分:1)

使用 itertools.combinations() - 你不必删除演员,你只能使用一个循环:

for actor1, actor2 in itertools.combinations(people_and_their_movies,2):
    <whatever you want to do>