我正在研究我的CS测试,并试图编写代码,给定整个IMDB数据库的明文,找到最常见的电影的演员。我已经完成了,我只是一直在遇到一个奇怪的KeyError。这是我的代码:
我遇到的问题是,当我运行它时,它会在运行突出显示的代码时产生一个keyerror。我已经验证它确实正在使用字符串索引字典,并且该密钥在字典中,但它仍然无效。有什么想法吗?
答案 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_people
和people_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>