Ask Your Question
0

Pb with headers in table()

asked 4 years ago

Cyrille gravatar image

updated 4 years ago

tmonteil gravatar image

Here is the forgotten function which list all the preferences on a list of candidates

def All_pref(cand=["A","B","C","D"],code=1) :
    ncand=len(cand)
    Scand=sorted(Set(cand))
    all_pref=Arrangements(Scand,ncand).list()
    all_pref1=[str(Word(x)) for x in all_pref]
    if code==1 :
        return ncand
    if code==2 :
        return all_pref1

I have a problem with the following function :

# Borda(cand=["A","B","C","D"],ne=[18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5],cond=0)
# cond = 0 redonne la répartition des préférences
# cond = 1 donne le classement des candidats sur chaque type de préférences
# cond = 2 donne les scores sur chaque candidat
# cond = 2 donne l'accumulation des scores sur chaque candidat
# cond = 3 déclare le vainqueur au sens de Borda.
def Borda(cand=["A","B","C","D"],ne=[18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5],cond=0) :
    Ap=All_pref(cand,2) 
    cond1=['$\\tiny${}{}{}{}$'.format(*w) for w in Ap]
    cond2 =[""]+ [r'${}$'.format(*w) for w in cand]
    cond3 =[r'${}$'.format(*w) for w in cand]
    t1=table([ne])#,header_row=cond1)
    rank=[[x.find(l) for x in Ap] for l in cand] 
    score_de_Borda=[[abs(x.find(l)-len(cand)) for x in Ap] for l in cand]
    t2=table(rank)#,header_row=cond1,header_column=cond2)
    total_score_de_Borda=[add([score_de_Borda[j][i]*ne[i] for i in range(24)]) for j in range(len(cand))]
    t3=table(score_de_Borda)#,header_column=cond3)
    max_total_score_de_Borda=max(total_score_de_Borda)
    ind_max_total_score_de_Borda=total_score_de_Borda.index(max_total_score_de_Borda)
    vainqueur_de_Borda=cand[ind_max_total_score_de_Borda] 
    if cond==0 :
        return t1
    if cond==1 :
        return t2
    if cond==2 :
        return t3
    if cond==3 :
        return total_score_de_Borda
    if cond==4 :
        return vainqueur_de_Borda

and here is a call to the different variations.

show(LatexExpr(r"\text{Le tableau des rangs est :}"))
show(Borda(["A","B","C","D"],[18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5],1))
show(LatexExpr(r"\text{Le tableau des scores est :}"))
show(Borda(["A","B","C","D"],[18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5],2))
show(LatexExpr(r"\text{Les scores totaux de chaque candidat sont :}"))
Borda(["A","B","C","D"],[18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5],3)
show(LatexExpr(r"\text{Le vainqueur d'un décompte à la Borda est : }"),
Borda(["A","B","C","D"],[18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5],4),LatexExpr(r"."))

All is fine but if inside the function i remove the# and allow the header(s), I have an error which I do not understand since some time it works and some time not. (I am working with sagemath 9.2 under windows).

Preview: (hide)

Comments

Some code is missiing:

NameError: name 'All_pref' is not defined

What 'All_pref' ?

tmonteil gravatar imagetmonteil ( 4 years ago )

Sorry, my notebook become hudge because I am trying to compute election result from all systems.

Cyrille gravatar imageCyrille ( 4 years ago )

In any case, when you have some issue, you should provide a minimal example showing the problem.

tmonteil gravatar imagetmonteil ( 4 years ago )

It works for me, i can not reproduce you issue when i remove the two #

tmonteil gravatar imagetmonteil ( 4 years ago )

I will try with an other computer. But the main thing is that it works for you.

Cyrille gravatar imageCyrille ( 4 years ago )

1 Answer

Sort by » oldest newest most voted
0

answered 4 years ago

Juanjo gravatar image

I think you can greatly simplify your code:

  • use f-strings instead of the format method;
  • use HTML instead of LaTeX to format headers, since elements in headers are not math expressions;
  • place conditionals at proper places, not at the end.

This works for me in a Jupyter notebook:

def All_pref(cand=["A","B","C","D"], code=1) :
    ncand = len(cand)
    Scand = sorted(Set(cand))
    all_pref = Arrangements(Scand,ncand).list()
    all_pref1 = [str(Word(x)) for x in all_pref]
    if code==1 :
        return ncand
    if code==2 :
        return all_pref1

def Borda(cand, ne, cond=0) :
    Ap=All_pref(cand,2) 
    cond1 = [w for w in Ap]
    cond3 = [f"<em>{w}</em>" for w in cand]
    cond2 = [""] + cond3
    if cond==0 :
        return table([ne], header_row=cond1)
    rank = [[x.find(l) for x in Ap] for l in cand] 
    score_de_Borda = [[abs(x.find(l)-len(cand)) for x in Ap] for l in cand]
    if cond==1 :
        return table(rank, header_row=cond1, header_column=cond2)
    total_score_de_Borda = [add([score_de_Borda[j][i]*ne[i] 
                                 for i in range(24)]) for j in range(len(cand))]
    if cond==3 :
        return total_score_de_Borda
    if cond==2 :
        return table(score_de_Borda, header_column=cond3)
    max_total_score_de_Borda = max(total_score_de_Borda)
    ind_max_total_score_de_Borda = total_score_de_Borda.index(max_total_score_de_Borda)
    if cond==4 : # vainqueur_de_Borda
        return cand[ind_max_total_score_de_Borda]

cand = ["A","B","C","D"]
ne = [18,16,14,12,11,20,19,14,16,12,2,1,0,0,20,16,13,15,11,10,9,8,7,5]
show(html("Le tableau des rangs est :"))
show(Borda(cand,ne,1))
show(html("Le tableau des scores est :"))
show(Borda(cand,ne,2))
show(html(f"Les scores totaux de chaque candidat sont : {Borda(cand,ne,3)}"))
show(html(f"Le vainqueur d'un décompte à la Borda est : {Borda(cand,ne,4)}."))
Preview: (hide)
link

Comments

I am trying to also post a link to a SageMath Cell with the above code, but, for unknown reasons, I get an error each time a write the long permalink. Anyway, this is the short temporary link: https://sagecell.sagemath.org/?q=apzuww

Juanjo gravatar imageJuanjo ( 4 years ago )

Hello, @Juanjo! In case you are trying to post the permalink as a comment, unfortunately, the link tends to be longer than the allowed number of characters for a comment. The odd thing is that sometimes there is no warning when that happens: Ask SageMath simply refuses to accept the publication.

In any case, is it my impression or more characters are allowed now?

dsejas gravatar imagedsejas ( 4 years ago )

I first tried to add the permalink at the end of the answer, but I got an "internal server error" which prevented it to be published. Comments seem to be limited to 800 characters, too few for a permalink if the code is a bit complex.

Juanjo gravatar imageJuanjo ( 4 years ago )

Thanks I was not aware of f-strings. And what about permalink. If I have an html page that can be usefull tosagemath users is there a way to publish it publicly ?

Cyrille gravatar imageCyrille ( 4 years ago )

Thanks a lot but I am surprise by the behavior of this little modification of 'cond 3' which gives the image added in the question.

table(total_score_de_Borda,header_row=cond3)

Cyrille gravatar imageCyrille ( 4 years ago )

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 4 years ago

Seen: 244 times

Last updated: Jan 07 '21