Как определить кандидат на победу в мгновенном голосовании, даже если у него нет большинства голосов? [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как определить кандидат на победу в мгновенном голосовании, даже если у него нет большинства голосов? [закрыто]

Сообщение Anonymous »

Я пытаюсь разрешить алгоритм мгновенного голосования . Подсчитайте первое место, голосуйте за каждого избирателя, и, если вариант имеет большинство избирает победителя, если нет, то проверьте связь на последнее место; Устранение опции «Последнее место», «Перераспределение голосования» - если это первый раунд, случайным образом исключите один вариант или используйте предыдущий раунд, чтобы исключить вариант с наименьшими голосами первого места.

Код: Выделить всё

from collections import Counter

def runoff(irv):
fs = [] # first choices
# adding first elements of sbublists to variable fs
for sublist in irv:
fs.append(sublist[0])
# sorting most frequent values
most_freq = [item for items, c in Counter(fs).most_common() for item in [items] * c]
# sorting least frequent values
least_freq = [item for items, c in Counter(fs).most_common() for item in [items] * c][-1]
# remove duplicates
check_freq = set(fs)
# checking tie
if len(check_freq) == len(fs):
return None
# eliminate last candidate
sec_choice = most_freq[:-1]
# choosing the winner with more than half votes
winner = [item for items, c in Counter(sec_choice).most_common() for item in [items] * c]
# initializing empty list for next stage
sec_stage = []
# eliminate last candidate
for i in winner:
if winner[-1] != winner[-2]:
del winner[-1]
# removing duplicates
check_same = set(winner)
# checking length of set and choosing winner from rest candidates
if len(check_same) == 1:
return ''.join(check_same)
else:
if winner[-1] != winner[-2]:
del winner[-1]

return winner[-1]
Пример данных:
case #1

Код: Выделить всё

irv = [["dem", "ind", "rep"],
["rep", "ind", "dem"],
["ind", "dem", "rep"],
["ind", "rep", "dem"]]
result = "ind"
case #2

Код: Выделить всё

irv = [['dem', 'ind', 'rep', 'lib', 'mus'],
['dem', 'mus', 'ind', 'rep', 'lib'],
['lib', 'mus', 'dem', 'rep', 'ind'],
['dem', 'ind', 'mus', 'lib', 'rep'],
['rep', 'lib', 'mus', 'dem', 'ind'],
['dem', 'lib', 'ind', 'mus', 'rep'],
['rep', 'mus', 'dem', 'ind', 'lib'],
['mus', 'lib', 'ind', 'dem', 'rep']]
он должен работать и для случайных входов: «Rep» должен равняться «Dem».

Подробнее здесь: https://stackoverflow.com/questions/796 ... -hasnt-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»