我有一个输入文件,我正试图建立一个字典

2024-10-03 17:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个输入文件,我正试图建立一个数据库
每一行都是这样的:

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'}


Tags: rawlen电影myoutdictinsidebill
1条回答
网友
1楼 · 发布于 2024-10-03 17:26:14
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(请参见here了解*如何解压元组的示例)。然后对于所有电影,它使用.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

如果密钥不存在,它会自动分配[]

相关问题 更多 >