2011-10-09 8 views
0

私は高収入の映画とそれらに最も類似した映画を並べ替えるテーブルを作ろうとしています。すべてのコードが完了しましたが、テーブルを完成するのに問題があります。Pythonのテーブルでforループを使用する

私のコード:

#import the data from the csv file and use DictRead to interpret the information. 

import csv 

csv_file = open("moviestats_med.csv") 
csv_data = csv.DictReader(csv_file) 


#create dictionary of films and their directors. 
direct = {} 
#create dictionary of films and their genres. 
genre = {} 
#create dictionary of films and each main actor. 
actor1 = {} 
actor2 = {} 
actor3 = {} 
#create dictionary of films and their worldwide gross. 
gross = {} 
#create dictionary of films and the year they came out. 
year = {} 

name = {} 
#iterate over the csv file to fill the dictionaries. 
for c in csv_data: 
    direct[c['name']] = c['director'] 
    genre[c['name']] = c['genre'] 
    actor1[c['name']] = c['actor1'] 
    actor2[c['name']] = c['actor2'] 
    actor3[c['name']] = c['actor3'] 
    gross[c['name']] = c['Worldwide Gross'] 
    year[c['name']] = c['date'] 
    name[c['name']] = c['name']  

#create a two-variable function to deterime the FavActor Similarity score: 
def FavActorFunction(film1,film2): 
    #set the result of the FavActor formula between two films to a default of 0. 
    FavActorScore = 0 
    #add 3 to the similarity score if the films have the same director. 
    if direct[film1] == direct[film2]: 
     FavActorScore += 3 
    #add 2 to the similarity score if the films are in the same genre. 
    if genre[film1] == genre[film2]: 
     FavActorScore += 2 
    #add 5 to the similarity score for each actor they have in common.      
    if actor1[film1] in (actor1[film2], actor2[film2], actor3[film2]): 
     FavActorScore += 5 
    if actor2[film1] in (actor1[film2], actor2[film2], actor3[film2]): 
     FavActorScore += 5 
    if actor3[film1] in (actor1[film2], actor2[film2], actor3[film2]): 
     FavActorScore += 5  
    #print the resulting score.      
    return FavActorScore 

#create a function to find the film with the greatest Worldwide Gross per year. 
def MaxGrossFinder(c): 
    #set the intial maximum gross to zero. 
    MaxGross = 0 
    #replace the MaxGross with any film in that year that has a greater gross. 
    for film in year:      
     f = int(gross[film])       
     if year[film] == c: 
      if f > MaxGross: 
       MaxGross = f 
       max = film 
    #print the year and the max value for that year.     
    return max 

#create a dictionary for the max grossing films of each year from 2000-2007. 
max_films = {}      
#create a list of years from 2000-2007.      
for c in ['2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007']: 
    max_films[c] = MaxGrossFinder(c) 



if 'a' == 'a': 
    max_list = [] 
    MaxSimilarity = 0 
    for d in year: 
     f = FavActorFunction(max_films[c], d)  
     if d != MaxGrossFinder(c): 
      if year[d] == c: 
       if f > MaxSimilarity: 
        MaxSimilarity = f 
        max = d 
    max_list.append(max) 

    MaxSimilarity2 = 0    
    for d in year: 
     g = FavActorFunction(max_films[c], d)  
     if d != MaxGrossFinder(c): 
      if d != max: 
       if year[d] == c: 
        if g > MaxSimilarity2: 
         MaxSimilarity2 = g 
         max2 = d 
    max_list.append(max2) 

    MaxSimilarity3 = 0    
    for d in year: 
     h = FavActorFunction(max_films[c], d)  
     if d != MaxGrossFinder(c): 
      if d != max and d != max2: 
       if year[d] == c: 
        if h > MaxSimilarity3: 
         MaxSimilarity3 = h 
         max3 = d 

    max_list.append(max3) 



    MaxSimilarity4 = 0    
    for d in year: 
     i = FavActorFunction(max_films[c], d)  
     if d != MaxGrossFinder(c): 
      if d != max and d != max2 and d != max3: 
       if year[d] == c: 
        if i > MaxSimilarity4: 
         MaxSimilarity4 = i 
         max4 = d 
    max_list.append(max4) 




print "Content-Type: text/html" 
print "" 
print "<html>" 
print "<body>" 
print "<table border=1>" 

print "<tr>" 
print "<th><font color=green>Year</font></th>" 
print "<th><font color=blue>Highest Grossing Film</font></th>" 
print "<th><font color=red>Most Similar</font></th>" 
print "<th><font color=red>2nd Most Similar</font></th>" 
print "<th><font color=red>3rd Most Similar</font></th>" 
print "<th><font color=red>4th Most Similar</font></th>" 
print "</tr>" 


for c in sorted(max_films): 
    print "<tr><th>" 
    print c 
    print "<td>" 
    print max_films[c] 
    print "</td><td>" 
    print max_list[0] 
    print "</td><td>" 
    print max_list[1] 
    print "</td><td>" 
    print max_list[2] 
    print "</td><td>" 
    print max_list[3] 
    print "</td></tr></th>" 

私が思い付くテーブルはほとんど正しいですが、すべての行で「最も類似」のフィルムはすべて初年度[2000]に対応しています。 「最も類似した」映画が正しいデータに対応するように、自分のコードを変更するにはどうすればよいですか?

答えて

3

いくつかのアドバイス:

  • なぜあなたはむしろmain_actors = []より "actor1 ACTOR2 ACTOR3" を使うのですか?内部に辞書を保存することができます!
  • また、あなたは(最後に)あなたの文字列で書式設定のようなprintf関数を使用することができ、最後にfor c in [2000, …. ]
  • の代わりにseqを使用して持つことができます:

print "<tr><th>%s<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td></td></tr></th>" % (c, max_films[c], max_list[0], max_list[1], max_list[2], max_list[3])

しかし、私は実際に考えますあなたの場合、問題はhtmlです:eatch行では使用しないでください。構文は次のとおりです。

<table> 
    <tr><th>Colname1</th><th>Colname2</th><th>Colname3</th></tr> 
    <tr><td>value 11</td><td>value 12</td><td>value 13</td></tr> 
    <tr><td>value 21</td><td>value 22</td><td>value 23</td></tr> 
    <tr><td>value 31</td><td>value 32</td><td>value 33</td></tr> 
</table> 

しかし、私はあなたのスクリプトで何かを逃しているかもしれません。

1
for c in sorted(max_films): 
    print "<tr><th>" 
    print c 
    print "<td>" 
    print max_films[c] 
    print "</td><td>" 
    print max_list[0] 
    print "</td><td>" 
    print max_list[1] 
    print "</td><td>" 
    print max_list[2] 
    print "</td><td>" 
    print max_list[3] 
    print "</td></tr></th>" 

ループを通過するたびに同じ変数max_list [0:4]を出力します。これらの変数を変更しないので、毎回同じ出力が得られます。

ロジックを移動して、最も類似したループを決定するか、ループ内でフェッチできるリストに最も類似したものを格納する新しいループを作成する必要があります。

関連する問題