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

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

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
  • Является ли я .__ dict __. Update (** kwargs) хорошим или плохим стилем?
  • Сопоставляемый по значениям dict для Python?
  • Словарь Python: удалите все ключи, начинающиеся с s
  • Заменить элементы в списке, используя словарь
  • Вычислить разницу в ключах, содержащихся в двух словарях Python
  • удалить все ключи, кроме одного словаря
  • Извлечь подмножество пар ключ-значение из объекта словаря Python?
  • Доступ к значениям ключа Python с символами запуска ключа
  • Словарь Python не имеет всех назначенных ключей или элементов
  • Переопределить dict с поддержкой numpy
  • Python - лучший язык программирования в мире.