#python
#python
Вопрос:
Я работаю над программой, которая считывает текстовый файл, содержащий список чемпионов чемпионата мира по футболу, и определяет по world_cup_champions.txt
файлу, показанному ниже, страну, выигравшую наибольшее количество чемпионатов. Страны отображаются в алфавитном порядке. Я получаю это сообщение об ошибке:
Traceback (most recent call last):
File "D:CUP.py", line 8, in <module>
for l in f2:
NameError: name 'f2' is not defined.
Вот мой код:
def main():
f2 = open("world_cup_champions.txt","r ")
dict_values ={}
temp_list = []
tmp_list2 = []
for l in f2:
temp_list.append(l.strip())
temp_list = temp_list[1:]
for val in temp_list:
tmp_val = val.split(',')
if tmp_val[1] not in dict_values:
dict_values[tmp_val[1]] = 1
else:
dict_values[tmp_val[1]] = 1
for key,value in dict_values.items():
tmp_list2.append([key, value])
tmp_list2.sort(key=lambda x: x[0])
print(" Country " " Wins " "Years")
for val in tmp_list2:
print(" " val[0] " " str(val[1]))
if __name__ == "__main__":
main()
Комментарии:
1. Это дословно из вашего файла кода? Похоже, вам нужно делать отступы от
dict_values ={}
доprint(" " val[0] " " str(val[1]))
. Python использует уровень отступа, чтобы решить, к какому блоку принадлежит каждая строка кода, поэтому прямо сейчас весь этот код выполняется так, как будто он не является частьюmain()
Ответ №1:
f2
определяется внутри def main()
, что делает его локальной переменной, когда вы вызываете ее в for l in f2
f2
функции, вне функции, поэтому вам нужна глобальная переменная для вызова. Если вы действительно собираетесь поместить все внутри main(), то вам нужно сделать отступы следующим образом
def main():
f2 = open("world_cup_champions.txt","r ")
dict_values ={}
temp_list = []
tmp_list2 = []
for l in f2:
temp_list.append(l.strip())
temp_list = temp_list[1:]
for val in temp_list:
tmp_val = val.split(',')
if tmp_val[1] not in dict_values:
dict_values[tmp_val[1]] = 1
else:
dict_values[tmp_val[1]] = 1
for key,value in dict_values.items():
tmp_list2.append([key, value])
tmp_list2.sort(key=lambda x: x[0])
print(" Country " " Wins " "Years")
for val in tmp_list2:
print(" " val[0] " " str(val[1]))
if __name__ == "__main__":
main()
Ответ №2:
Это проблема с отступом. f2
определяется внутри main
, что означает, что его нельзя использовать вне main
. Вы попытались использовать ее в for l in f2
цикле, что привело к вашему NameError
.
Ваша main
функция имеет только один оператор, f2 = open("world_cup_champions.txt","r ")
, поэтому вы, вероятно, хотели определить свою программу следующим образом:
def main():
f2 = open("world_cup_champions.txt","r ")
dict_values ={}
temp_list = []
tmp_list2 = []
for l in f2:
temp_list.append(l.strip())
temp_list = temp_list[1:]
for val in temp_list:
tmp_val = val.split(',')
if tmp_val[1] not in dict_values:
dict_values[tmp_val[1]] = 1
else:
dict_values[tmp_val[1]] = 1
for key,value in dict_values.items():
tmp_list2.append([key, value])
tmp_list2.sort(key=lambda x: x[0])
print(" Country " " Wins " "Years")
for val in tmp_list2:
print(" " val[0] " " str(val[1]))
if __name__ == "__main__":
main()
Если вы просто хотели включить это одно утверждение main
, но хотели использовать f2
его во всей программе, вы могли бы определить main
так:
def main():
global f2
f2 = open("world_cup_champions.txt","r ")
Первый оператор, global f2
, делает main
define f2
глобальной переменной, а не локальной переменной при ее вызове, что позволит вам использовать ее во всей программе, а не только в одной функции.
Ответ №3:
В вашем коде неверный отступ, в качестве альтернативы вы можете немного отредактировать его
def main():
f2 = open("world_cup_champions.txt","r ")
dict_values ={}
temp_list = []
tmp_list2 = []
for l in f2:
temp_list.append(l.strip())
temp_list = temp_list[1:]
for val in temp_list:
tmp_val = val.split(',')
if tmp_val[1] not in dict_values:
dict_values[tmp_val[1]] = 1
else:
dict_values[tmp_val[1]] = 1
for key,value in dict_values.items():
tmp_list2.append([key, value])
tmp_list2.sort(key=lambda x: x[0])
print(" Country " " Wins " "Years")
for val in tmp_list2:
print(" " val[0] " " str(val[1]))
if __name__ == "__main__":
main()
в качестве альтернативы, просто сделайте это
def main():
return open("world_cup_champions.txt","r ")
dict_values ={}
temp_list = []
tmp_list2 = []
f2 = main()
for l in f2:
temp_list.append(l.strip())
temp_list = temp_list[1:]
for val in temp_list:
tmp_val = val.split(',')
if tmp_val[1] not in dict_values:
dict_values[tmp_val[1]] = 1
else:
dict_values[tmp_val[1]] = 1
for key,value in dict_values.items():
tmp_list2.append([key, value])
tmp_list2.sort(key=lambda x: x[0])
print(" Country " " Wins " "Years")
for val in tmp_list2:
print(" " val[0] " " str(val[1]))
if __name__ == "__main__":
main()
Ответ №4:
У вас отключен отступ. Вам нужно, чтобы все операторы были встроены в первый.
def main():
f2 = open("world_cup_champions.txt","r ")
dict_values ={}
temp_list = []
tmp_list2 = []
Комментарии:
1. У меня возникла проблема с этой строкой: temp_list = temp_list[1:] Первый элемент добавляется в список. Затем этот оператор берется из 2-го элемента, с 1-й позиции до конца, делая список пустым. Это продолжается по мере прохождения цикла, по существу удаляя каждый элемент по мере его добавления.