2013-04-15 2 views
0

У меня есть текстовый файл с сотнями тысяч учеников и их рейтинги для определенных фильмов, организованных с первым словом, являющимся номером студента, вторым из которых является название фильма (с без пробелов), а третий является рейтинг они не дали фильм:Поддержание порядка в большом списке фильмов/оценок

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 

Я хотел бы организовать их в словарь, чтобы я каждый студент отображается в списке их рейтингами фильмов, где рейтинги в том же порядке для каждого ученика. Другими словами, я хотел бы иметь это так:

{student1000 : [1, 3, -5, 0, 0, 3, 0,...]} 
{student1001 : [0, 1, 0, 0, -3, 0, 1,...]} 

Такое, что первый, второй, третий и т.д. оценки для каждого студента соответствуют тем же фильмам. Порядок абсолютно случайен для фильмов и номеров учеников, и у меня довольно много проблем с этим. Любая помощь в том, чтобы придумать что-то, что свести к минимуму сложность этой проблемы, было бы потрясающе.

Я закончил тем, что понял. Вот код, который я использовал для тех, кто интересно:

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 

Спасибо за помощь!

ответ

2

Вы можете сначала создать словарь словарей:

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

Затем вы можете пройти через это, чтобы получить главный список всех фильмов, установить порядок для них (что соответствует порядку в рейтинге каждого студента список) и, наконец, пройти через каждого ученика в словаре, конвертируя словарь в нужный вам список. Или, как сказал другой ответ, просто сохраните его как словарь.

defaultdict, вероятно, пригодится. Это позволяет вам сказать, что значение по умолчанию для каждого ученика - это пустой список (или словарь), поэтому вам не нужно его инициализировать, прежде чем вы начнете добавлять значения (или установите пары ключ-значение).

from collections import defaultdict 

students = defaultdict(dict) 
with open(filename, 'r') as f: 
    for line in f.readlines(): 
     elts = line.split() 
     student = elts[0] 
     movie = elts[1] 
     rating = int(elts[2]) 
     students[student][movie] = rating 
0

Просто поместите оценки в словарь, а не в список. После того, как вы прочтете все данные, вы сможете извлечь имена фильмов и поместить их в любом порядке. Предполагая, что учащиеся могут оценивать разные фильмы, сохраняя какой-то последовательный порядок при чтении файла, не зная порядок фильмов для начала, кажется, что много работы.

Если вы беспокоитесь о том, что ключи занимают много памяти, используйте клавиши intern(), чтобы убедиться, что вы сохраняете только одну копию каждой строки.

1

Итак, ответы здесь функционально то же самое, что вы, кажется, ищет, но, насколько непосредственно построения списков, которые вы ищете, они, кажется, отвечая на несколько иные вопросы. Лично я бы предпочел сделать это более динамично. Так как мне не кажется, что вы действительно знаете фильмы, которые будут оцениваться раньше времени, вы должны сохранить какую-то текущую статистику.

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 

Это не так, как я хотел бы подойти к этой проблеме, но я думаю, что это решение является самым близким к первоначальному намерению вопроса, и вы можете использовать буфер, чтобы кормить в строках, если есть проблема памяти, но если ваш файл имеет несколько гигабайт, с этим не должно быть никаких проблем.

+0

Похоже, это то, что я ищу.Тем не менее, переменная «оценки [ученик]» дает ошибку, когда я пытаюсь получить длину, потому что это Nonetype. Я не очень знаком с типами Python, но как я могу сообщить компьютеру, что это список? – weskpga

+0

Если вы просто скажете оценки [student] = [] Это должно позволить python знать, что это список. Он должен создавать экземпляр списка в цикле, если ученик не в рейтингах. Не могли бы вы рассказать немного больше о своей точной ошибке и реализации? –

+0

Я понял это, как видно из моего редактирования. Спасибо за помощь! – weskpga

 Смежные вопросы

  • Нет связанных вопросов^_^