【问题标题】:using a for-loop in a table in python在python的表中使用for循环
【发布时间】:2011-10-09 12:14:08
【问题描述】:

我正在尝试制作一张表格,以整理出票房高的电影以及与它们最相似的电影。所有代码都已完成,但我无法完成表格。

我的代码:

#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]。如何更改我的代码,以便“最相似”的电影对应正确的数据?

【问题讨论】:

    标签: python html for-loop


    【解决方案1】:

    一些建议:

    • 为什么你使用“actor1 actor2 actor3”而不是main_actors = []?您可以在里面存储字典!
    • 您也可以使用seq 代替for c in [2000, …. ]
    • 最后,您可以对字符串使用类似 printf 的格式(在末尾),并且:

    print "&lt;tr&gt;&lt;th&gt;%s&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/th&gt;" % (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>
    

    但我可能遗漏了你脚本中的某些内容。

    【讨论】:

      【解决方案2】:
      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]。由于您当然不会更改这些变量,因此每次都会获得相同的输出。

      您需要移动您的逻辑来决定哪个与循环中最相似,或者创建一个新循环,将最相似的内容存储在一个列表中,该列表可以在您的循环中获取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-28
        • 2013-11-18
        • 1970-01-01
        • 2019-01-15
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多