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

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

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())] 

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

  • Сглаживать вложенные словари Python, сжимать ключи
  • Python: соберите этот словарь (dict in dict)
  • Доступ к вложенным словарным элементам через список ключей?
  • Я получаю ошибку ключа в python
  • Один лайнер: создание словаря из списка с индексами в виде ключей
  • флип-ключи и значения в словаре python
  • Переменные Python как ключи к dict
  • Как отсортировать IP-адреса, хранящиеся в словаре в Python?
  •  
    Interesting Posts for Van-Lav

    Написание метаданных в pdf с использованием pyobjc

    Если оперативная память не вызывает беспокойства, то читается по очереди быстрее или читает все в ОЗУ и получает к ней доступ? – Python

    Подкоманда подкоманды Python: argparse?

    Как правильно проверить покрытие с помощью Django + Nose

    PyGraphViz agraph.layout () выдает ошибку I0

    Как создать безопасную ссылку nginx в python

    Django 1.9 Installation SyntaxError: недопустимый синтаксис

    Разделение списка на неравные группы?

    доверие и интервалы прогнозирования с помощью StatsModels

    Является ли os.popen действительно устаревшим в Python 2.6?

    Как сохранить и загрузить файлы cookie с помощью python selenium webdriver

    Получить pid рекурсивных подпроцессов

    Как сделать нелинейный комплексный поиск корней в Python

    Панды: как избавиться от колонки «Без имени:» в фрейме данных

    Есть ли более сжатый / pythonic способ сделать это? (считая самый длинный ряд головок, хвостов в переворотах монет)

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