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

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

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 ..

  • Установите вложенное значение dict и создайте промежуточные ключи
  • Преобразование строкового ключа в int в словаре
  • Класс python, который действует как dict
  • Преобразование JSON в Python dict
  • Эффективный способ удаления ключей с пустыми строками из dict
  • Назначение значения переменной класса присваивает его всем экземплярам этого объекта
  • Кроме того, он исключает только букву с наименьшим значением на первом месте только один раз. Я хочу, чтобы он повторил этот процесс, пока я не получу одного победителя в конце. Таким образом, в этом случае все 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», «Нет»)

  • Python - открыть новую команду оболочки и запустить
  • Как получить доступ к i-му столбцу многомерного массива NumPy?
  • Tastypie - Вложенные ресурсы не найдены
  • Каковы преимущества (и недостатки) слабо типизированного языка?
  • Как заставить bokeh пропускать отсутствующие даты при использовании datetime как оси x
  • словарь из csv-файла python
  • 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 - лучший язык программирования в мире.