import json import sys if len(sys.argv) > 1: poll_file=sys.argv[1] else: print('missing file argument') exit(1) verbose=False with open(poll_file,'r') as poll_fd: poll = json.load(poll_fd) if verbose: print(poll) votants=poll['votants']['decompte'] candidats=poll['candidats'] nombre_candidats=len(candidats) # l'ordre des mentions est de la meilleure à la pire (reject) mentions=poll['mentions'] default_mention=len(mentions)-1 votes=poll["votation"]["votes"] if verbose: print('candidats:' + str(candidats)) print(votes) default_vote={} for candidat in candidats: default_vote[candidat]=default_mention collect={} for vote in votes: # missing candidat in vote is the worts one for candidat in candidats: if not candidat in vote: vote[candidat]=default_mention for candidat,mention in vote.items(): if candidat in collect: if mention in collect[candidat]: collect[candidat][mention]=collect[candidat][mention]+1 else: collect[candidat][mention]=1 else: collect[candidat]={mention:1} if verbose: print(collect) votant_median_check= votants / 2 if votants % 2 == 0 else ((votants-1) / 2) +1 votant_median=votants // 2 + votants % 2 if votant_median_check != votant_median: print('[ERROR] le nombre median de votants semble erroné. contactez le developpeur de ce code.' + str(votant_median_check)) merite={} mention_mediane={} # cumul : du meilleur au pire # range_mentions = range(len(mentions)) # cumul du pire au meilleur range_mentions = range(len(mentions)-1,-1,-1) for candidat in candidats: vote=collect[candidat] cumul=0 m=[0 for i in range(len(mentions))] mention_m=None for mention in range_mentions: if mention in vote: cumul=cumul+vote[mention] if cumul >= votant_median and mention_m is None: mention_m=mention m[mention]=cumul if cumul < votants: print('[ERROR] le cumul des votes doit correspondre au nombre de votants. contactez le developpeur de ce code.') mention_mediane[candidat]=mention_m merite[candidat]=m if verbose: print(merite) print(mention_mediane) # les gagnants sont ceux qui ont la mention minimale ( la meilleure ) found=[] for mention in range(0,len(mentions)): for candidat,merite_median in mention_mediane.items(): if merite_median == mention: found.append({candidat:candidats[candidat]}) if len(found) > 0: break if verbose: print(found) print(mentions[mention]) result = {'resultat':{'mention':mentions[mention],'candidats':found},'merite':merite} print(json.dumps(result))