3

我现在正在为我的 CS 测试而学习,并尝试编写代码,给定整个 IMDB 数据库以明文形式,找到与最多共同电影的演员。我已经完成了,我只是不断地遇到一个奇怪的 KeyError。这是我的代码:

在此处输入图像描述

我遇到的问题是,当我运行它时,它在运行突出显示的代码时会产生一个 keyerror。我已经验证它确实在用字符串索引字典,并且所述键在字典中,但它仍然无法正常工作。有任何想法吗?

4

4 回答 4

8

当你这样做时other_people = people_and_their_movies,你不是在制作副本。您正在other_people指向指向的同一对象people_and_their_movies。所以当你这样做时,你会从两个del other_people[actor1]字典中删除演员(因为它们是相同的)。

相反,做other_people = people_and_their_movies.copy().

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

于 2012-11-18T05:14:09.963 回答
2

问题在于这行代码:

other_people = people_and_their_movies

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

del other_people[actor1]

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

你可以试试这个:

other_people = people_and_their_movies.copy()
于 2012-11-18T05:15:04.610 回答
1

Use itertools.combinations() - and you won't have to delete actors, and you'll be able to use only one loop:

for actor1, actor2 in itertools.combinations(people_and_their_movies,2):
    <whatever you want to do>
于 2012-11-18T06:27:14.903 回答
1

之前你分配

other_people = people_and_their_movies

所以当你

del other_people[actor1]

您实际上是从两个字典中删除该键。 other_peoplepeople_and_their_movies在此时指向同一个对象。

查看 python 的copy模块以获取制作 dict 的真实副本的方法,这样您就可以安全地将它们解耦并仅从两者中的一个中删除。

于 2012-11-18T05:17:46.700 回答