# conditional expressions

Bengt Richter bokr at oz.net
Sat Sep 28 11:57:27 EDT 2002

```On Fri, 27 Sep 2002 15:24:04 -0700, "Mike Rovner" <mike at bindkey.com> wrote:

>
>"Terry Reedy" <tjreedy at udel.edu> wrote in message
>news:t_3l9.334924\$AR1.14880141 at bin2.nnrp.aus1.giganews.com...
>> na=1; np=3; nl=1; ng=0
>> print "Found: %d apple%s, %d plum%s, %d lemon%s, and %d grape%s." %\
>> (na, na!=1 and 's' or '', np, np!=1 and 's' or '', nl, nl!=1 and 's'
>> or '', ng, ng!=1 and 's' or '')
>>
>> Found: 1 apple, 3 plums, 1 lemon, and 0 grapes.
>>
>> Alternatives to this 'risky' construct:
>> 1. forgo the nicety of correct English output
>> 2. nest if/else four levels deep to choose correct variant of 16 print
>> statements (ugh)
or just generate the correct variant:
fmt = "Found: %%d apple%s, %%d plum%s, %%d lemon%s, and %%d grape%s." % \
tuple([('','s')[x!=1] for x in [na,np,nl,ng]])
print fmt % (na, np, nl, ng)

or pre-generate all sixteen:
>>> fmtList=["Found: %%d apple%s, %%d plum%s, %%d lemon%s, and %%d grape%s." % (a,p,l,g)
... for a in ('','s') for p in ('','s') for l in ('','s') for g in ('','s') ]

and select the correct one by index:
>>> fmt = fmtList[(na!=1)*8+(np!=1)*4+(nl!=1)*2+(ng!=1)]
>>> print fmt % (na, np, nl, ng)
Found: 1 apple, 3 plums, 1 lemon, and 0 grapes.

>> 3. precalculate 4 suffixes and store in 4 temp vars with 4 if/else's
>> (8 or 16 lines);
>>    though clearly superiour to 2), this is still tedious with some
>> risk of typo error.
Why so many lines? If you really want the temps:
tmpa, tmpp, tmpl, tmpg = [('','s')[x!=1] for x in [na,np,nl,ng]]
or
tmpa, tmpp, tmpl, tmpg = map(lambda x:'s'[x==1:], [na,np,nl,ng])
>>
>4. Try:
>use_s=('','s')
>print "Found: %d apple%s, %d plum%s, %d lemon%s, and %d grape%s." %\
>(na, use_s[na!=1], np, use_s[np!=1], nl, use_s[nl!=1], ng, use_s[ng!=1])
>
5.:
>>> na=1; np=3; nl=1; ng=0
>>> def s(n): return 's'[n==1:]
...
>>> print "Found: %d apple%s, %d plum%s, %d lemon%s, and %d grape%s." % (
...               na,  s(na), np, s(np), nl,  s(nl),     ng, s(ng)
... )
Found: 1 apple, 3 plums, 1 lemon, and 0 grapes.

6.:
>>> class NQ:
...     def __init__(self, name, quant):
...         self.name = name
...         self.quant = quant
...     def __str__(self):
...         return '%s %s%s' % (self.quant, self.name, ('', 's')[self.quant!=1])
...
>>> print "Found: %s, %s, %s, and %s." % (
...     NQ('apple',na), NQ('plum',np), NQ('lemon',nl), NQ('grape',ng)
... )
Found: 1 apple, 3 plums, 1 lemon, and 0 grapes.

7.:
>>> print "Found: %d apple%s, %d plum%s, %d lemon%s, and %d grape%s." % \
... tuple([[x, x!=1 and 's' or ''][y] for x in [na,np,nl,ng] for y in [0,1]])
Found: 1 apple, 3 plums, 1 lemon, and 0 grapes.

... ;-)

Regards,
Bengt Richter

```