我有一个输入文件,我正试图从中构建数据库。
每一行看起来像这样:
Amy Shchumer, Trainwreck, I Feel Pretty, Snatched, Inside Amy Shchumer
Bill Hader,Inside Out, Trainwreck, Tropic Thunder
等等。
第一个字符串是 Actor \女 Actor ,然后是他们出演的电影。
数据未排序,它们是一些尾随空格。
我想创建一个如下所示的字典:
{'Trainwreck': {'Amy Shchumer', 'Bill Hader'}}
键是电影,值应该是其中的 Actor ,统一在一组数据类型中。
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)
它不起作用...它没有解决当 key 已经存在时应该将 actor 与前一个 actor 统一在一个集合中的问题
相反,我最终得到:
'Trainwreck':{'Amy Shchumer'},'Inside Out':{'Bill Hader'}
最佳答案
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检查它是否在数据库中,如果是则返回列表,如果不是则返回空列表。然后它将新 Actor 添加到列表中。
另一种方法是使用 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
如果 key 不存在,它会自动分配 []
。
关于python - 我有一个输入文件,我正在尝试从中构建字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54154866/