Программа Чемпионата мира по Python

#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-й позиции до конца, делая список пустым. Это продолжается по мере прохождения цикла, по существу удаляя каждый элемент по мере его добавления.