维持大名单电影/收视率秩序

2024-10-02 20:41:29 发布

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

我有一个有几十万学生的文本文件,他们对某些电影的评分,第一个单词是学生编号,第二个单词是电影名称(没有空格),第三个单词是他们对电影的评级:

student1000 Thor 1
student1001 Superbad -3
student1002 Prince_of_Persia:_The_Sands_of_Time 5
student1003 Old_School 3
student1004 Inception 5
student1005 Finding_Nemo 3
student1006 Tangled 5

我想把它们排在字典里,这样我就把每个学生都映射到他们的电影收视率列表中,其中每个学生的收视率顺序是相同的。换言之,我希望它是这样的:

^{pr2}$

使每个学生的第一、第二、第三等评分与相同的电影相对应。电影和学生人数的顺序完全是随机的,我很难有效地做到这一点。任何能使这个问题的复杂程度最小化的方法的帮助都将是非常棒的。在

我终于弄明白了。以下是我为想知道的人准备的代码:

def get_movie_data(fileLoc):
    movieDic = {}
    movieList = set()

    f = open(fileLoc)
    setHold = set()
    for line in f:
        setHold.add(line.split()[1])
    f.close()
    movieList = sorted(setHold)

    f = open(fileLoc)
    for line in f:
        hold = line.strip().split()
        student = hold[0]
        movie = hold[1]
        rating = int(hold[2])
        if student not in movieDic:
            lst = [0]*len(movieList)
            movieDic[student] = lst
        hold2 = movieList.index(movie)
        rate = movieDic[student]
        rate[hold2] = rating
    f.close()
    return movieList, movieDic

谢谢你的帮助!在


Tags: ofin电影linemovie评分单词student
3条回答

您可以先构建字典:

{
 'student1000' : {'Thor': 1, 'Superbad': 3, ...}, 
 'student1001' : {'Thor': 0, 'Superbad': 1, ...},
 ...
}

然后你可以通过这个过程得到所有电影的主列表,为它们建立一个顺序(对应于每个学生的评分列表中的顺序),最后在字典中检查每个学生,将字典转换成你想要的列表。或者,就像另一个答案说的,把它当作字典来保存。在

defaultdict可能会派上用场。它允许您假设每个学生的默认值是一个空列表(或字典),因此您不必在开始附加值(或设置键值对)之前对其进行初始化。在

^{pr2}$

把分数放在字典里而不是单子里。在您阅读完所有数据之后,您可以提取电影名称并将它们按您想要的任何顺序排列。假设学生能给不同的电影评分,在阅读文件时保持某种一致的顺序,而不知道电影的顺序,这似乎是一项艰巨的工作。在

如果您担心密钥会占用大量内存,请在键上使用intern(),以确保只存储每个字符串的一个副本。在

在功能上,你所要寻找的答案,似乎与你所寻找的答案有点不同。就我个人而言,我更愿意以更具活力的方式来做这件事。因为在我看来,你并不是真的知道要提前评级的电影,所以你必须对这一点做一些记录。在

ratings = {}   
allMovies = [] 
    for line in file:
        info = line.split(" ")
        movie = info[1].strip().lower()
        student = info[0].strip().lower()
        rating = float(info[2].strip().lower())
        if movie not in allMovies:
            allMovies.append(movie)
        movieIndex = allMovies.index(movie)
        if student not in ratings:
            ratings[student] = ([0]*(len(allMovies)-1)).append(rating)
        else:
            if len(allMovies) > len(ratings[student]):
                ratings[student] = ratings[student].extend([0]*(len(allMovies)-len(ratings[student]))
            ratings[student][movieIndex] = rating

这不是我解决这个问题的方法,但我认为这个解决方案最接近问题的初衷,如果内存有问题,你可以使用一个缓冲区来填充行,但是除非你的文件是几GB,否则这个问题不应该存在。在

相关问题 更多 >