我正在尝试将两个列表组合在一起并将它们放入字典中。这是我目前的代码:
from string import*
book_ratings=open("ratings.txt","r")
usernames=[]
ratings=[]
for i in book_ratings.readlines(): #i=index
i=split(i) #splits usernames from ratings
rating=i[:] #allows whole ratings list to be stored in ratings
ratings.append(rating) #appends rating to ratings list
usernames.append(i) #appends usernames to usernames list
books=open("books.txt","r")
book_list=[]
i=books.readlines()
book_list.append(i) #appends books to book_list list
user_book_ratings={}
for ratings in book_ratings:
user_book_ratings.join(book_list,ratings)
不幸的是,最后三行只打印出一个空列表。如何组合评级和book_list列表,并将它们放在一个字典中,其中用户名作为键,新列表作为值?
提前谢谢。
*修改
文件 ratings.txt 如下所示:
“本5 0 0 0 0 0 0 1 0 1 -3 5 0 0 0 5 5 0 0 0 0 5 0 0 0 0 0 0 0 0 1 3 0 1 0 -5 0 0 5 5 0 5 5 5 0 5 5 0 0 0 5 5 5 5 -5驼鹿5 5 0 0 0 0 3 0 0 1 0 5 3 0 5 0 3 3 5 0 0 0 0 0 5 0 0 0 0 0 3 5 0 0 0 0 0 5 -3 0 0 0 5 0 0 0 0 0 0 5 5 0 3 0 0 ...“(有更多用户,这些是前两个)
使用上述代码打印时,显示为:
“[['Ben'],['5','0','0','0','0','0','0','1','0','1 ',' - 3','5','0','0','0','5','5','0','0','0','0','5' ,'0','0','0','0','0','0','0','0','1','3','0','1',' 0',' - 5','0','0','5','5','0','5','5','5','0','5','5 ','0','0','0','5','5','5','5','-5'],['驼鹿'],['5','5' ,'0','0','0','0','3','0','0','1','0','5','3','0',' 5','0','3','3','5','0','0','0','0','0','5','0','0' ,'0','0','0','3','5','0','0','0','0','0','5',' - 3', '0','0','0','5','0','0','0','0','0','0','5','5','0 ','3','0','0'] ......“
文件 books.txt 如下所示:
道格拉斯亚当斯,“银河系漫游指南”
Richard Adams,Watership Down
Mitch Albom,你在天堂遇见的五个人
Laurie Halse Anderson,说话
Maya Angelou,我知道为什么笼中的鸟唱歌
......(有更多的书;这些是前五个)
使用上述代码打印时,如下所示:
<[>“[[”道格拉斯亚当斯,银河系漫游指南\ n“,'理查德亚当斯,下水道','Mitch Albom,你在天堂遇见的五个人','Laurie Halse Anderson,说话,'Maya Angelou,我知道为什么笼中的鸟唱歌\ n'......“
最终,字典应显示为:
{Ben:[“Douglas Adams,银河系漫游指南”,“5”],[“Richard Adams,Watership Down”,“0”] ......驼鹿:[“Douglas Adams,The Hitchhiker's Guide到银河“,”5“] ......}等等(或类似的东西)。
我们的想法是为每本书分配相关用户的评分。
我希望我的事情更清楚。
答案 0 :(得分:0)
以下是如何组合两个列表:
def combine(listone, listtwo):
out = {}
for k in range(0, len(listone)):
out[listone[k]] = listtwo[k]
return out
运行如下:
>>> combine(['hello', 'is', 'a', 'word'], [5, 2, 1, 4])
{'a': 1, 'is': 2, 'word': 4, 'hello': 5}
顺便说一下,这些列表基本上是每个字符串的长度
答案 1 :(得分:0)
首先获取您的书名 ,因为您想在阅读用户名时知道这些名称 - 然后您可以将所有数据直接放入最终的词典中,并使用较少的中间列表。由于readlines
已经为您提供了一个列表,所以不需要对此进行任何追加 - 所以,只需这样做:
with open('books.txt', 'r') as books:
book_titles = books.readlines()
使用with语句可确保文件在读完后立即关闭。
既然你已经拥有它,你获得用户名和评级的方式与你拥有的基本相同,尽管它可以简化一点:
with open('ratings.txt', 'r') as ratings:
for line in ratings:
username, *ratings = line.split()
此语法告诉Python拆分字符串并将第一个(最左侧)组件分配给用户名(作为字符串),并将 rest 分组到一个列表中并提出评级。
你想要的词典(你需要在这个循环之前的某个时候将它初始化为一个空的dict)将用户名作为键,并将值作为来自rating和book_titles的相应对的列表。 Python有一个名为zip
的内置函数可以为你获取这些对 - 虽然它在Python 3中没有为你提供列对,所以你需要将结果传递给{{1 }}:
list