Ошибка атрибута: объект ‘tuple’ не имеет атрибута ‘get’ в Python 3

#python-3.x #sorting #get #tuples #namedtuple

#python-3.x #сортировка #получить #кортежи #namedtuple

Вопрос:

У меня есть два списка. получен один из кандидатов и один из голосов. Я хочу отсортировать их по убыванию полученных голосов. Архивирование работает нормально. Когда я печатаю тип результирующего списка, он возвращается как класс ‘list’. Затем я сортирую и, бам!, получаю AttributeError: 'tuple' object has no attribute get . Я не знаю, как это исправить, и был бы признателен за руководство.

 for i in range(len(uniquecandidate)):
    result = zip(uniquecandidate, votes) # zips two lists together  

result_list = list(result)
print(type(result_list))   # returns <class 'list'>

result_list.sort(key=lambda x: x.get('votes'), reverse=True) #sort by vote number

print(result_list, end='nn')
                                                   
 

Код и ошибка

Комментарии:

1. ошибка dict для списка?

Ответ №1:

zip возвращает список кортежей; вы можете отсортировать их, обратившись к элементам с их индексом:

 result_list.sort(key=lambda x: x[1], reverse=True)
 

если вы хотите быть более явным, вы можете использовать collections.namedtuple и получить доступ к элементу через точечную нотацию в имени атрибута:

 from collections import namedtuple


Poll = namedtuple('Poll', ['candidate', 'numvotes'])

uniquecandidate = ['a', 'b', 'c', 'd']
votes = [3, 4, 7, 1]

poll_results = list(map(Poll, uniquecandidate, votes))
poll_results.sort(key=lambda x: x.numvotes, reverse=True)

print(poll_results)
 

или с typing.NamedTuple :

 from typing import NamedTuple

class Poll(NamedTuple):
    candidate: str
    numvotes: int

uniquecandidate = ['a', 'b', 'c', 'd']
votes = [3, 4, 7, 1]

poll_results = list(map(Poll, uniquecandidate, votes))
poll_results.sort(key=lambda x: x.numvotes, reverse=True)

print(poll_results)
 

out:

 [Poll(candidate='c', numvotes=7), Poll(candidate='b', numvotes=4), Poll(candidate='a', numvotes=3), Poll(candidate='d', numvotes=1)]
 

Ответ №2:

Поскольку ваши кандидаты и голоса хранятся в объектах tuple, метод get () не будет работать с ними, как со словарем. Я рекомендую переключиться с

x.get (‘votes’)

к этому:

x [1]

Это приведет к получению индекса 1 каждого кортежа (который в вашем случае является подсчетом голосов).