#python #html #for-loop
#python #HTML #цикл 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]. Как я могу изменить свой код, чтобы «наиболее похожие» фильмы соответствовали правильным данным?
Ответ №1:
Несколько советов:
- Почему вы используете «actor1 actor2 actor3», а не
main_actors = []
? Вы можете хранить словари внутри! - Вы также можете использовать
seq
вместоfor c in [2000, …. ]
- Наконец, вы могли бы использовать форматирование, подобное 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: вы не должны использовать 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] каждый раз, когда проходите цикл. Поскольку вы не изменяете эти переменные, конечно, вы получаете один и тот же результат каждый раз.
Вам нужно либо переместить свою логику, чтобы решить, какая из них наиболее похожа на цикл, либо создать новый цикл, в котором хранятся наиболее похожие в списке, который может быть извлечен внутри вашего цикла.