Задача Python Assignment о явке избирателей: класс, объект и функция - PullRequest
0 голосов
/ 21 июня 2019
# implement County class here
class County:
  def __init__(self, name,population,voters):
    self.name=name
    self.population=population
    self.voters=voters

  # implement the function here

def highest_turnout(data):

highest_turnout = (data[0].voters)/(data[0].population)
for county in data:
    if (county.voters/county.population) > highest_turnout:
        highest_turnout= county
return highest_turnout

allegheny = County("allegheny", 1000490, 645469)
philadelphia = County("philadelphia", 1134081, 539069)
montgomery = County("montgomery", 568952, 399591)
lancaster = County("lancaster", 345367, 230278)
delaware = County("delaware", 414031, 284538)
chester = County("chester", 319919, 230823)
bucks = County("bucks", 444149, 319816)
data = [allegheny, philadelphia, montgomery, lancaster, delaware, chester, bucks]  

result = highest_turnout(data) # do not change this line!
print(result) # prints the output of the function
# do not remove this line!

Я должен сделать функцию Python, в которой возвращается наибольшая явка избирателей. Я только начинающий программист, а ресурсы класса на самом деле не помогают.Любая помощь будет очень ценится.Спасибо.

Указания:
● Сначала найдите округ с наибольшей явкой, то есть с наибольшим процентом населения, проголосовавшего, используя атрибуты населения объектов и избирателей
● Затем вернитеськортеж, содержащий название округа с самой высокой явкой и процент населения, проголосовавшего в этом порядке;процент должен быть представлен в виде числа от 0 до 1

Я уже написал класс.

TypeError: '>' не поддерживается между экземплярами 'float' и 'County'

Я получил эту ошибку.Я думаю, что мой класс правильный, но я не совсем уверен, что делать с этой функцией.В инструкции также сказано, чтобы вернуть имя округа и наибольшую явку избирателей в кортеже, но я не совсем уверен, как.Пожалуйста помоги.Спасибо.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

В качестве альтернативы, вместо того, чтобы использовать цикл, чтобы найти максимальное количество избирателей, используйте функцию max:

class County:

    def __init__(self, name, population, voters):
        self.name = name
        self.population = population
        self.voters = voters

    def get_turnout(self):
        # return the turnout as a number between 0 - 1.
        return self.voters / self.population

def highest_turnout(counties):
    max_county = max(counties, key=lambda c: c.get_turnout())
    return (max_county.name, max_county.get_turnout())
0 голосов
/ 21 июня 2019

Вот ваша проблема:

highest_turnout = (data[0].voters)/(data[0].population)
for county in data:
    if (county.voters/county.population) > highest_turnout:
        highest_turnout= county

Итак, давайте рассмотрим первую (ну, вторую - ту, что касается data[1], поскольку итерация data[0] здесь не актуальна) итерации этого цикла. highest_turnout было просто определено как float избирателей / населения. Вы сравниваете это с другой float избирателей / населения другой страны. Имеет смысл.

Теперь давайте рассмотрим, что voters / population выше для data[1], чем для data[0]. Итак, условие if срабатывает. highest_turnout имеет значение data[1], которое является текущим значением county.

Мы переходим к следующей итерации, для data[2], и вы получаете ошибку:

TypeError: '>' not supported between instances of 'float' and 'County'

В первой итерации highest_turnout было float, и вы использовали оператор > между двумя floats. Но сейчас , highest_turnout - это County, а не float - когда вы присвоили ему новое значение внутри оператора if, вы изменили его тип. А поскольку County не является типом числа, python не знает, как его сравнить с float. Таким образом, ошибка, которую вы видите здесь.

Решение состоит в том, чтобы сделать highest_turnout значением, с которым оно сравнивалось, а не страной, из которой получены эти значения:

highest_turnout = county.voters / county.population

Альтернативным решением будет сохранить highest_turnout страну все время:

highest_turnout = data[0]
for county in data:
    if (county.voters/county.population) > (highest_turnout.voters/highest_turnout.population):
        highest_turnout = county

Вам просто нужно убедиться, что вы не меняете тип любой переменной, не осознавая этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...