如何组合两个列表并将结果存储在字典中(在Python中)?

时间:2014-03-22 22:42:37

标签: python dictionary

我正在尝试将两个列表组合在一起并将它们放入字典中。这是我目前的代码:

    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“] ......}等等(或类似的东西)。

我们的想法是为每本书分配相关用户的评分。

我希望我的事情更清楚。

2 个答案:

答案 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