Как индексировать данные в python в соответствии с каждым именем поля из схемы? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть данные, которые выглядят так (но намного больше и имеют больше ключей).

 [{'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, но не по другим полевым именам из схемы:

def index_by_title(moviess):
    return {movie['movie_title']: movie for movie in moviess}

Как индексировать его по каждому ключу из схемы(это список ключей), не только для заголовка?При работе с произвольными полями для индексации также несколько фильмов могут иметь один и тот же ключ.Например, я должен быть в состоянии индексировать по годам, и, конечно, многие фильмы снимаются каждый год.Поэтому значения в индексах должны быть списками.К сожалению, вы не можете сделать это с пониманием списка.Я думаю, что я должен использовать для цикла.

1 Ответ

0 голосов
/ 30 ноября 2018

Если ваши входные данные действительно являются строкой, вы можете использовать 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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...