我有一个有几十万学生的文本文件,他们对某些电影的评分,第一个单词是学生编号,第二个单词是电影名称(没有空格),第三个单词是他们对电影的评级:
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
谢谢你的帮助!在
您可以先构建字典:
然后你可以通过这个过程得到所有电影的主列表,为它们建立一个顺序(对应于每个学生的评分列表中的顺序),最后在字典中检查每个学生,将字典转换成你想要的列表。或者,就像另一个答案说的,把它当作字典来保存。在
defaultdict可能会派上用场。它允许您假设每个学生的默认值是一个空列表(或字典),因此您不必在开始附加值(或设置键值对)之前对其进行初始化。在
^{pr2}$把分数放在字典里而不是单子里。在您阅读完所有数据之后,您可以提取电影名称并将它们按您想要的任何顺序排列。假设学生能给不同的电影评分,在阅读文件时保持某种一致的顺序,而不知道电影的顺序,这似乎是一项艰巨的工作。在
如果您担心密钥会占用大量内存,请在键上使用
intern()
,以确保只存储每个字符串的一个副本。在在功能上,你所要寻找的答案,似乎与你所寻找的答案有点不同。就我个人而言,我更愿意以更具活力的方式来做这件事。因为在我看来,你并不是真的知道要提前评级的电影,所以你必须对这一点做一些记录。在
这不是我解决这个问题的方法,但我认为这个解决方案最接近问题的初衷,如果内存有问题,你可以使用一个缓冲区来填充行,但是除非你的文件是几GB,否则这个问题不应该存在。在
相关问题 更多 >
编程相关推荐