RESULTS: Complementary PEP308 Ternary Vote

Norman Petry npetry@accesscomm.ca
09 Mar 2003 13:02:52 -0600


IMPORTANT NOTE: 

The results shown below are for the complementary, UNOFFICIAL vote on
the issue of adding a ternary operator to Python (PEP308).  These
results will probably be a bit different from the OFFICIAL results,
which are being tabulated by Raymond Hettinger using a different
technique and a different set of ballots.  Both sets of results are
non-binding, and intended only to advise the BDFL about the Python
community's wishes regarding the implementation of PEP308.  Hopefully,
this supplemental vote will provide Guido van Rossum with additional
insight into the wishes of Python users. See: 

http://mail.python.org/pipermail/python-list/2003-March/151680.html

for additional information about this vote.

This COMPLEMENTARY vote used a ranked ballot and Condorcet's method to
determine a winner.  For background information about how this method
works, see:

http://www.electionmethods.org/CondorcetEx.htm

The results shown below are based on 101 ballots received over a one
week period (March 3-9).  The ballots themselves may be viewed here:

http://mail.python.org/pipermail/python-list/2003-March/152304.html


VOTING SOFTWARE
===============

GNU GPL-licensed voting software written in Python is available to
verify these results.  It could also be used again in future votes if
the Python community wishes to use Condorcet's method to advise the BDFL
on other PEPs.  You can download a package containing this software as
well as all the data used for this vote from:

http://24.72.22.210/pepvote.tar.gz

This software was written and tested using Python 2.2 running on Red Hat
Linux 8.0.  Use on other platforms may require some adaptation.


SINGLE WINNER
=============

The Condorcet Winner is: "NO TERNARY".


SOCIAL RANKING (Tideman)
========================

 1. NO TERNARY
 2. if C then t else f
 3. (if C: t else: f)
 4. C ? t : f
 5. if C: t else: f
 6. t if C else f
 7. C then t else f
 8. t when C else f
 9. C ? t ! f
10. C ?? t || f
11. C ? t else f
12. when C: t else f
13. C -> t else f
14. case C: t else f
15. ifelse C: t else f
16. select C: t else f
17. cond(C, t, f)
18. C -> (t, f)
19. C and t else f
20. <if C then t else f>
21. [t if C else f]

Kemeny Score: 9681


PAIRWISE COMPARISONS
====================

Option "NO TERNARY":
   beats option "if C then t else f" [50 - 43]
   beats option "(if C: t else: f)" [50 - 45]
   beats option "C ? t : f" [54 - 41]
   beats option "if C: t else: f" [55 - 38]
   beats option "t if C else f" [56 - 36]
   beats option "C then t else f" [64 - 29]
   beats option "t when C else f" [67 - 25]
   beats option "C ? t ! f" [70 - 23]
   beats option "C ?? t || f" [70 - 23]
   beats option "C ? t else f" [69 - 23]
   beats option "when C: t else f" [73 - 17]
   beats option "C -> t else f" [75 - 17]
   beats option "case C: t else f" [74 - 15]
   beats option "ifelse C: t else f" [76 - 13]
   beats option "select C: t else f" [75 - 14]
   beats option "cond(C, t, f)" [74 - 19]
   beats option "C -> (t, f)" [76 - 15]
   beats option "C and t else f" [73 - 17]
   beats option "<if C then t else f>" [78 - 13]
   beats option "[t if C else f]" [80 - 12]

Option "if C then t else f":
   beats option "(if C: t else: f)" [38 - 37]
   beats option "C ? t : f" [41 - 36]
   beats option "if C: t else: f" [45 - 32]
   beats option "t if C else f" [43 - 31]
   beats option "C then t else f" [51 - 15]
   beats option "t when C else f" [54 - 19]
   beats option "C ? t ! f" [52 - 20]
   beats option "C ?? t || f" [51 - 21]
   beats option "C ? t else f" [55 - 13]
   beats option "when C: t else f" [61 - 9]
   beats option "C -> t else f" [62 - 7]
   beats option "case C: t else f" [63 - 5]
   beats option "ifelse C: t else f" [63 - 4]
   beats option "select C: t else f" [63 - 6]
   beats option "cond(C, t, f)" [62 - 10]
   beats option "C -> (t, f)" [63 - 6]
   beats option "C and t else f" [61 - 8]
   beats option "<if C then t else f>" [60 - 7]
   beats option "[t if C else f]" [62 - 9]

Option "(if C: t else: f)":
   beats option "C ? t : f" [47 - 33]
   beats option "if C: t else: f" [44 - 26]
   beats option "t if C else f" [47 - 32]
   beats option "C then t else f" [52 - 23]
   beats option "t when C else f" [55 - 21]
   beats option "C ? t ! f" [60 - 13]
   beats option "C ?? t || f" [59 - 14]
   beats option "C ? t else f" [62 - 8]
   beats option "when C: t else f" [63 - 7]
   beats option "C -> t else f" [62 - 7]
   beats option "case C: t else f" [66 - 1]
   beats option "ifelse C: t else f" [67 - 1]
   beats option "select C: t else f" [66 - 2]
   beats option "cond(C, t, f)" [65 - 8]
   beats option "C -> (t, f)" [62 - 8]
   beats option "C and t else f" [63 - 7]
   beats option "<if C then t else f>" [64 - 1]
   beats option "[t if C else f]" [64 - 6]

Option "C ? t : f":
   beats option "if C: t else: f" [40 - 37]
   beats option "t if C else f" [43 - 37]
   beats option "C then t else f" [44 - 32]
   beats option "t when C else f" [49 - 28]
   beats option "C ? t ! f" [54 - 5]
   beats option "C ?? t || f" [53 - 7]
   beats option "C ? t else f" [55 - 10]
   beats option "when C: t else f" [57 - 13]
   beats option "C -> t else f" [54 - 10]
   beats option "case C: t else f" [59 - 12]
   beats option "ifelse C: t else f" [59 - 8]
   beats option "select C: t else f" [59 - 11]
   beats option "cond(C, t, f)" [56 - 15]
   beats option "C -> (t, f)" [56 - 6]
   beats option "C and t else f" [53 - 14]
   beats option "<if C then t else f>" [57 - 11]
   beats option "[t if C else f]" [60 - 10]

Option "if C: t else: f":
   beats option "t if C else f" [47 - 34]
   beats option "C then t else f" [53 - 27]
   beats option "t when C else f" [56 - 23]
   beats option "C ? t ! f" [56 - 15]
   beats option "C ?? t || f" [55 - 16]
   beats option "C ? t else f" [57 - 13]
   beats option "when C: t else f" [59 - 11]
   beats option "C -> t else f" [59 - 9]
   beats option "case C: t else f" [63 - 6]
   beats option "ifelse C: t else f" [64 - 5]
   beats option "select C: t else f" [62 - 7]
   beats option "cond(C, t, f)" [59 - 11]
   beats option "C -> (t, f)" [61 - 9]
   beats option "C and t else f" [62 - 8]
   beats option "<if C then t else f>" [59 - 7]
   beats option "[t if C else f]" [60 - 11]

Option "t if C else f":
   beats option "C then t else f" [39 - 33]
   beats option "t when C else f" [52 - 9]
   beats option "C ? t ! f" [45 - 29]
   beats option "C ?? t || f" [44 - 31]
   beats option "C ? t else f" [46 - 26]
   beats option "when C: t else f" [45 - 24]
   beats option "C -> t else f" [50 - 20]
   beats option "case C: t else f" [46 - 22]
   beats option "ifelse C: t else f" [49 - 18]
   beats option "select C: t else f" [49 - 19]
   beats option "cond(C, t, f)" [54 - 17]
   beats option "C -> (t, f)" [50 - 22]
   beats option "C and t else f" [48 - 19]
   beats option "<if C then t else f>" [48 - 23]
   beats option "[t if C else f]" [54 - 8]

Option "C then t else f":
   beats option "t when C else f" [41 - 21]
   beats option "C ? t ! f" [42 - 24]
   beats option "C ?? t || f" [40 - 25]
   beats option "C ? t else f" [42 - 21]
   beats option "when C: t else f" [48 - 15]
   beats option "C -> t else f" [52 - 11]
   beats option "case C: t else f" [50 - 11]
   beats option "ifelse C: t else f" [55 - 5]
   beats option "select C: t else f" [52 - 9]
   beats option "cond(C, t, f)" [47 - 19]
   beats option "C -> (t, f)" [55 - 11]
   beats option "C and t else f" [52 - 7]
   beats option "<if C then t else f>" [52 - 14]
   beats option "[t if C else f]" [54 - 10]

Option "t when C else f":
   beats option "C ? t ! f" [34 - 32]
   beats option "C ?? t || f" [34 - 30]
   beats option "C ? t else f" [36 - 29]
   beats option "when C: t else f" [31 - 27]
   beats option "C -> t else f" [39 - 22]
   beats option "case C: t else f" [31 - 27]
   beats option "ifelse C: t else f" [39 - 20]
   beats option "select C: t else f" [36 - 23]
   beats option "cond(C, t, f)" [42 - 23]
   beats option "C -> (t, f)" [40 - 24]
   beats option "C and t else f" [35 - 23]
   beats option "<if C then t else f>" [38 - 25]
   beats option "[t if C else f]" [43 - 12]

Option "C ? t ! f":
   beats option "C ?? t || f" [29 - 18]
   beats option "C ? t else f" [31 - 19]
   beats option "when C: t else f" [34 - 24]
   beats option "C -> t else f" [34 - 13]
   beats option "case C: t else f" [40 - 19]
   beats option "ifelse C: t else f" [40 - 13]
   beats option "select C: t else f" [40 - 16]
   beats option "cond(C, t, f)" [37 - 20]
   beats option "C -> (t, f)" [37 - 15]
   beats option "C and t else f" [40 - 18]
   beats option "<if C then t else f>" [36 - 16]
   beats option "[t if C else f]" [44 - 11]

Option "C ?? t || f":
   beats option "C ? t else f" [29 - 22]
   beats option "when C: t else f" [34 - 23]
   beats option "C -> t else f" [35 - 14]
   beats option "case C: t else f" [38 - 18]
   beats option "ifelse C: t else f" [41 - 13]
   beats option "select C: t else f" [38 - 17]
   beats option "cond(C, t, f)" [36 - 21]
   beats option "C -> (t, f)" [36 - 13]
   beats option "C and t else f" [34 - 20]
   beats option "<if C then t else f>" [35 - 18]
   beats option "[t if C else f]" [42 - 12]

Option "C ? t else f":
   beats option "when C: t else f" [31 - 25]
   beats option "C -> t else f" [33 - 11]
   beats option "case C: t else f" [39 - 17]
   beats option "ifelse C: t else f" [41 - 11]
   beats option "select C: t else f" [39 - 15]
   beats option "cond(C, t, f)" [36 - 20]
   beats option "C -> (t, f)" [39 - 12]
   beats option "C and t else f" [37 - 18]
   beats option "<if C then t else f>" [38 - 15]
   beats option "[t if C else f]" [41 - 13]

Option "when C: t else f":
   beats option "C -> t else f" [28 - 21]
   beats option "case C: t else f" [33 - 5]
   beats option "ifelse C: t else f" [28 - 12]
   beats option "select C: t else f" [28 - 11]
   beats option "cond(C, t, f)" [33 - 20]
   beats option "C -> (t, f)" [31 - 23]
   beats option "C and t else f" [32 - 18]
   beats option "<if C then t else f>" [33 - 18]
   beats option "[t if C else f]" [35 - 16]

Option "C -> t else f":
   beats option "case C: t else f" [28 - 23]
   beats option "ifelse C: t else f" [28 - 17]
   beats option "select C: t else f" [28 - 20]
   loses to option "cond(C, t, f)" [24 - 27]
   beats option "C -> (t, f)" [32 - 10]
   beats option "C and t else f" [31 - 20]
   beats option "<if C then t else f>" [27 - 20]
   beats option "[t if C else f]" [32 - 17]

Option "case C: t else f":
   ties option "ifelse C: t else f" [18 - 18]
   ties option "select C: t else f" [16 - 16]
   beats option "cond(C, t, f)" [30 - 24]
   beats option "C -> (t, f)" [28 - 25]
   beats option "C and t else f" [29 - 18]
   beats option "<if C then t else f>" [32 - 18]
   beats option "[t if C else f]" [34 - 15]

Option "ifelse C: t else f":
   beats option "select C: t else f" [22 - 11]
   ties option "cond(C, t, f)" [26 - 26]
   loses to option "C -> (t, f)" [23 - 25]
   beats option "C and t else f" [24 - 22]
   beats option "<if C then t else f>" [27 - 20]
   beats option "[t if C else f]" [29 - 17]

Option "select C: t else f":
   beats option "cond(C, t, f)" [28 - 24]
   beats option "C -> (t, f)" [26 - 25]
   beats option "C and t else f" [26 - 20]
   beats option "<if C then t else f>" [30 - 18]
   beats option "[t if C else f]" [30 - 16]

Option "cond(C, t, f)":
   beats option "C -> (t, f)" [28 - 24]
   beats option "C and t else f" [30 - 26]
   beats option "<if C then t else f>" [28 - 25]
   beats option "[t if C else f]" [29 - 24]

Option "C -> (t, f)":
   beats option "C and t else f" [27 - 24]
   beats option "<if C then t else f>" [26 - 23]
   beats option "[t if C else f]" [33 - 17]

Option "C and t else f":
   beats option "<if C then t else f>" [26 - 25]
   beats option "[t if C else f]" [29 - 20]

Option "<if C then t else f>":
   beats option "[t if C else f]" [26 - 17]

-- 
Norman Petry