如何根据模式中的每个字段名称在python中索引数据?

时间:2018-11-29 21:08:18

标签: python database loops dictionary indexing

我有一个看起来像这样的数据(但是更大,并且具有更多的键)。

 [{'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循环。

1 个答案:

答案 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}}