我有一个看起来像这样的数据(但是更大,并且具有更多的键)。
[{'director_name': 'James Cameron','gross': 760505847, 'genres': ['Action', 'Adventure', 'Fantasy', 'Sci-Fi'],'actor_1_name': 'CCH Pounder','movie_title': 'Avatar','budget': 237000000,'title_year': 2009, 'imdb_score': 7.9},{'director_name': 'Gore Verbinski','num_critic_for_reviews': 302,'gross': 309404152,'genres': ['Action', 'Adventure', 'Fantasy'],'actor_1_name': 'Johnny Depp','movie_title': "Pirates of the Caribbean: At World's End",'budget': 300000000,'title_year': 2007,'imdb_score': 7.1},{'director_name': 'Sam Mendes', 'gross': 200074175,'genres': ['Action', 'Adventure', 'Thriller'],'actor_1_name': 'Christoph Waltz','movie_title': 'Spectre','budget': 245000000,'title_year': 2015,'imdb_score': 6.8}]
我已经编写了这段代码,该代码使我可以通过movie_title进行索引,但不能通过架构中的其他field_names进行索引:
def index_by_title(moviess):
return {movie['movie_title']: movie for movie in moviess}
如何不仅根据标题,而是根据架构中的每个键(键的列表)为它建立索引? 当处理任意字段以进行索引时,几部电影也可能具有相同的键。例如,我应该能够按年份编制索引,当然,每年都会制作许多电影。因此,索引中的值应为列表。不幸的是,您不能通过列表理解来做到这一点。我认为我应该使用for循环。
答案 0 :(得分:0)
如果您的输入数据确实是一个字符串,则可以使用ast.ast.literal_eval将输入转换为Python对象:
import ast
import pprint
rawData = """[{'director_name': 'James Cameron','gross': 760505847, 'genres': ['Action', 'Adventure', 'Fantasy', 'Sci-Fi'],'actor_1_name': 'CCH Pounder','movie_title': 'Avatar','budget': 237000000,'title_year': 2009, 'imdb_score': 7.9},{'director_name': 'Gore Verbinski','num_critic_for_reviews': 302,'gross': 309404152,'genres': ['Action', 'Adventure', 'Fantasy'],'actor_1_name': 'Johnny Depp','movie_title': "Pirates of the Caribbean: At World's End",'budget': 300000000,'title_year': 2007,'imdb_score': 7.1},{'director_name': 'Sam Mendes', 'gross': 200074175,'genres': ['Action', 'Adventure', 'Thriller'],'actor_1_name': 'Christoph Waltz','movie_title': 'Spectre','budget': 245000000,'title_year': 2015,'imdb_score': 6.8}]"""
def index_by_title(moviess, key):
return {movie[key]: movie for movie in moviess if key in movie}
data = ast.literal_eval(rawData)
print index_by_title(data, 'director_name')
这将返回:
{'Gore Verbinski': {'actor_1_name': 'Johnny Depp',
'budget': 300000000,
'director_name': 'Gore Verbinski',
'genres': ['Action', 'Adventure', 'Fantasy'],
'gross': 309404152,
'imdb_score': 7.1,
'movie_title': "Pirates of the Caribbean: At World's End",
'num_critic_for_reviews': 302,
'title_year': 2007},
'James Cameron': {'actor_1_name': 'CCH Pounder',
'budget': 237000000,
'director_name': 'James Cameron',
'genres': ['Action', 'Adventure', 'Fantasy', 'Sci-Fi'],
'gross': 760505847,
'imdb_score': 7.9,
'movie_title': 'Avatar',
'title_year': 2009},
'Sam Mendes': {'actor_1_name': 'Christoph Waltz',
'budget': 245000000,
'director_name': 'Sam Mendes',
'genres': ['Action', 'Adventure', 'Thriller'],
'gross': 200074175,
'imdb_score': 6.8,
'movie_title': 'Spectre',
'title_year': 2015}}