У меня есть входной файл, из которого я пытаюсь построить словарь - PullRequest
0 голосов
/ 12 января 2019

У меня есть входной файл, из которого я пытаюсь построить базу данных.
Каждая строка выглядит следующим образом:

Amy Shchumer, Trainwreck, I Feel Pretty, Snatched, Inside Amy Shchumer  
Bill Hader,Inside Out,  Trainwreck, Tropic Thunder 

И так далее.
Первая строка - актер \ актриса, а затем фильмы, в которых они сыграли.
Данные не отсортированы, и они представляют собой пробелы в конце.

Я хотел бы создать словарь, который будет выглядеть следующим образом:
{'Trainwreck': {'Amy Shchumer', 'Bill Hader'}}
Ключом будет фильм, значения должны быть актерами в нем, объединенными в заданный тип данных.

def create_db():
   my_dict = {}
   raw_data = open('database.txt','r+') 
   for line in raw_data:
      lst1 = line.split(",") //to split by the commas 
      len_row = len(lst1)
      lst2 = list(lst1) 
      for j in range(1,len_row):
         my_dict[lst2[j]] = set([lst2[0]])
print(my_dict)

Это не работает ... это не решает проблему, заключающуюся в том, что, если ключ уже существует, актер должен быть объединен в набор с предыдущим актором.

Вместо этого я получаю:
'Trainwreck': {'Amy Shchumer'}, 'Inside Out': {'Bill Hader'}

1 Ответ

0 голосов
/ 12 января 2019
def create_db():
    db = {}
    with open("database.txt") as data:
        for line in data.readlines():
            person, *movies = line.split(",")
            for m in movies:
                m = m.strip()
                db[m] = db.get(m, []) + [person]

    return db

Выход:

{'Trainwreck': ['Amy Shchumer', 'Bill Hader'], 
 'I Feel Pretty': ['Amy Shchumer'], 
 'Snatched': ['Amy Shchumer'], 
 'Inside Amy Shchumer': ['Amy Shchumer'], 
 'Inside Out': ['Bill Hader'], 
 'Tropic Thunder': ['Bill Hader']}

Это будет циклически перебирать данные и присваивать первое значение каждой строки person, а остальные movies (см. здесь для примера того, как * распаковывает кортежи). Затем для всех фильмов он использует .get , чтобы проверить, находится ли он в базе данных, и возвращает список, если он есть, и пустой список, если его нет. Затем он добавляет нового актера в список.

Другой способ сделать это - использовать defaultdict :

from collections import defaultdict

def create_db():
    db = defaultdict(lambda: [])
    with open("database.txt") as data:
        for line in data.readlines():
            person, *movies = line.split(",")
            for m in movies:
                db[m.strip()].append(person)

    return db

, который автоматически присваивает [], если ключ не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...