0

私は何十万人もの学生のテキスト ファイルを持っており、特定の映画に対する彼らの評価は、最初の単語が学生番号、2 番目が映画の名前 (スペースなし)、3 番目が彼らの評価で構成されています。映画:

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,...]}

各学生の 1 番目、2 番目、3 番目などの評価が同じ映画に対応するようにします。映画と学生番号の順序は完全にランダムであり、これを効果的に行うのにかなり苦労しています。この問題の大きな複雑さを最小限に抑える何かを考え出すための助けは素晴らしいでしょう.

私はそれを理解することになりました。疑問に思っている人のために使用したコードは次のとおりです。

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

助けてくれてありがとう!

4

3 に答える 3

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
于 2013-04-15T23:29:22.633 に答える
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

これは私がこの問題に取り組む方法ではありませんが、この解決策は質問の元の意図に最も近いと思います。メモリに問題がある場合はバッファを使用して行をフィードできますが、ファイルが数ギガバイトでない限り、そこにあるはずですそれは問題にならない。

于 2013-04-15T23:51:59.530 に答える