Как правильно исключить элементы в словаре до тех пор, пока не останется одна строка

Мне действительно нужна помощь в этом

def get_winner (dict_winner): new_dict = {} for winner in dict_winner: first_letter = winner[0] value = dict_winner[winner] if first_letter in new_dict: new_dict[first_letter] += value else: new_dict[first_letter] = value return (new_dict) get_winner({ ('C', 'A', 'B', 'D') :3, ('D', 'B', 'C', 'A') :2, ('C', 'D', 'A', 'B') :1, ('A', 'D', 'B', 'C') :2, ('A', 'D', 'C', 'B') :4, ('A', 'C', 'D', 'B') :2 }) #Outputs {'A': 8, 'D': 2, 'C': 4} 

Теперь я хочу, чтобы результатом был кортеж str, NoneType ..

Кроме того, он исключает только букву с наименьшим значением на первом месте только один раз. Я хочу, чтобы он повторил этот процесс, пока я не получу одного победителя в конце. Таким образом, в этом случае все B будут устранены в самом dict, а не на выходе. например:

 first time = [8, 0, 4, 2] second time = { ('C', 'A', 'D') :3, ('D', 'C', 'A') :2, ('C', 'D', 'A') :1, ('A', 'D', 'C') :2, ('A', 'D', 'C') :4, ('A', 'C', 'D') :2 }) #Outputs C = 4 D = 2 A = 8 third time= { ('C', 'A') :3, ('C', 'A') :2, ('C', 'A') :1, ('A', 'C') :2, ('A', 'C') :4, ('A', 'C') :2 }) #Outputs C = 6 A = 8 

8/14> 50%, я знаю, что это должно было быть с самого начала, потому что у A уже было большинство. Но я предполагаю, что значение A имеет значение 40%, которое должно начинаться с устранения. Итак, вы могли бы указать, где я ошибался, кодируя это? В примере A должен быть победителем! Таким образом, на выходе будет («A», «Нет»)

2 Solutions collect form web for “Как правильно исключить элементы в словаре до тех пор, пока не останется одна строка”

Ваш текущий код подсчитывает количество раз, когда каждый кандидат является первым в списке. Он никого не «ликвидирует», он просто дает вид, потому что один из ваших кандидатов не получает голоса на первое место.

Я предлагаю сделать это рекурсивно. В вашем базовом случае «кандидат получает более 50% голосов». Что-то вроде этого:

 def get_winner(vote_dict) total_votes = sum(vote_dict.values()) votes_by_candidate = defaultdict(int) # This makes your if/else block redundant for vote_pattern in vote_dict: votes_by_candidate[vote_pattern[0]] += vote_dict[vote_pattern] for candidate in votes_by_candidate: if votes_by_candidate[candidate] * 2 > total_votes: return candidate new_dict = defaultdict(int) eliminated = min(votes_by_candidate, key=votes_by_candidate.get) for vote_pattern in vote_dict: new_pattern = [candidate for candidate in vote_pattern if candidate != eliminated] new_dict[new_pattern] += vote_dict[vote_pattern] return get_winner(new_dict) 

Мое решение – в один шаг:

 def get_winner(candidates): winners = dict.fromkeys(map(lambda f: f[0] for f in candidates.keys())) for cand, votes in candidates.iteritems(): winners[cand[0]]+=votes return [winner for winner, vote in winners.iteritems() if vote ==max(winners.values())] 

Это не фантазия, но это просто 🙂

Interesting Posts

Случайное Python: Что произойдет, если я не использую семя (someValue)?

Python: как построить карту тепла для координат с разной интенсивностью цвета или разным радиусом окружностей?

Python: os.path.getmtime () для временных меток TZ, происходящих из SD-карт с различными форматами

Лучшая практика для написания общих числовых функций, которые работают как с ndarray, так и с MaskedArray

Возможны ли несвязанные дескрипторы?

перенаправить вывод в текстовый файл с помощью оболочки Windows '>' в python

градиентный спуск с использованием python и numpy

TypeError: unorderable types: str () <int ()

Отбросить все повторяющиеся строки в Python Pandas

Должен ли я использовать строку Unicode по умолчанию?

Выражение факторного симпсипа для матричных коэффициентов?

Как использовать словарь для обновления полей в моделях Django?

socket.error: Адрес уже используется

Почта REST с использованием Python-Request

Как извлечь массивы из упорядоченного массива numpy?

Python - лучший язык программирования в мире.