[Tutor] Is there an easily or shorter way?

Dave Angel davea at davea.name
Mon Dec 15 23:59:11 CET 2014


On 12/15/2014 04:25 PM, Ken G. wrote:
> I am sure there is a better way to refine the following lines.
>
> Letting x equal a number from 1 to 28, go through 28 separate 'if'
> statements to print a resulting value that equaled the value of x.
>
> For example:
>
> x = 8
>
> if x = 1, print 'one'
> if x = 2, print 'two'
> ...
> ...
> if x = 8, print 'eight'
> ...
> ...
> if x = 28, print 'twenty eight'
>
> Would a single line using list or dictionary be shorter?
>

If this is an assignment, and you quoted it correctly, then you're 
required to go through 28 if statements.  On the other hand, if that 
paragraph is just a description of the way you solved it, then yes, it 
can be improved.  Just making all but the first if statement an elif 
will make it faster, because once it finds a value, it won't continue 
checking the remaining ones.

Still faster would be testing first for fourteen, and making a tree out 
of the if statements, using > and < comparisons instead of only == 
comparisons.  Worst case would be about 5 tests.  This would not be more 
compact, just quicker to execute.

Faster yet, and somewhat more compact would be to make a tuple or list 
of 29 items (0 through 28), and just index into it.

Slower, but more compact, would be to write the kind of library that 
Danny pointed you to, or the code that Ken/Bod alluded to.

But the real question is what's your goal.   Your original code isn't 
legal Python, so you're presumably in a learning mode.  If so, you want 
to keep it simple, not use 3rd party libraries for something you could 
do yourself.  And when you're given an assignment, you should do it 
exactly the way they want it, and only after that's correct (and 
running), do it also in other ways.  Those other ways could be to 
improve performance, reduce size, make it more readable (or less, to 
enter it in obfuscation contests), to make it independent of any loaded 
libraries, to look like some sample in another language, ...


My second suggestion, untested:
if x < 14:
     if x < 7:
          if x < 3:
              if x == 1:
                    print ("one")
              else:
                    print ("two")
          elif x < 5:
              if x == 3:
                    print ("three")
              else:
                    print ("four")
....



-- 
DaveA


More information about the Tutor mailing list