2011-10-09 70 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

一些建議:

  • 你爲何用 「actor1 actor2 actor3」,而不是main_actors = []?你可以在裏面儲存字典!
  • 也可以代替for c in [2000, …. ]
  • 使用seq最後,你可以用printf像你的字符串格式化(末),並具有:

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行中使用th。語法如下:

<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]。既然你不改變這些變量,那麼你每次都會得到相同的輸出。

您需要移動您的邏輯來決定哪一個最類似於循環,或者創建一個新的循環,將最相似的內容存儲在您的循環中可以獲取的列表中。