Ваш код имеет две проблемы
Первая проблема , которая у вас есть, находится в следующих строках:
if actor in movie_dict:
movie_dict[actor].append(key)
else:
movie_dict[actor] = (key)
Когда вы пишете movie_dict[actor] = (key)
, вы не создаетекортеж - скобки только для старшинства.Чтобы создать кортеж, вам необходимо добавить запятую в конце:
movie_dict[actor] = (key,)
В любом случае, это не будет работать, так как кортежи неизменны.Вам следует либо использовать список:
if actor in movie_dict:
movie_dict[actor].append(key)
else:
movie_dict[actor] = [key] # Square brackets
, либо создавать новые кортежи:
if actor in movie_dict:
movie_dict[actor] = movie_dict[actor] + (key,)
else:
movie_dict[actor] = (key,)
Я настоятельно рекомендую вам использовать первый вариант.Если вам действительно нужно использовать кортежи, преобразуйте списки в кортежи после обработки.
Вторая проблема заключается в том, что вы ожидаете
'rush hour 2'
равным
'rush hour 2'
, как видно из словаря:
{'jackie chan':
('rush hour', 'rush hour 2'),
'crish tucker':
('rush hour', 'rush hour 2')}
Но это не так:
>>> 'rush hour 2' == 'rush hour 2'
False
Как вы могли решитьЭто?Что ж, самое простое решение, которое я разработал, - это разбить строку на пробелы, а затем воссоединить ее с одним пробелом:
def invert_actor_dict(actor_dict):
movie_dict = {}
for key,value in actor_dict.iteritems():
for actor in value:
split_movie_name = key.split()
# 'rush hour 2'.split() == ['rush', 'hour', '2']
movie_name = " ".join(split_movie_name)
# " ".join(['rush', 'hour', '2']) == 'rush hour 2'
if actor in movie_dict:
movie_dict[actor].append(movie_name)
else:
movie_dict[actor] = [movie_name]
return movie_dict