Hi, On Sat, Feb 2, 2019 at 8:54 PM Avi Gross <avigr...@verizon.net> wrote: > > I may be missing something, but the focus seems to be only on the rightmost > digit. You can get that with > > > str(day)[-1] > or with > day % 10 > > Problem: print 1..31 using suffixes such as 1st, 2nd, 3rd, 4th ... > > So your dictionary needs entries for "1" or 1 and "2" or "2" and of course 3 > becoming 3rd. > > And, frankly, you don't even need a dictionary as a one-liner will do. > > Here is an example using a helper function: > > """ Use last digit to determine suffix """ > > def nthSuffix(day): > nth = day % 10 > suffix = "st" if nth == 1 else ("nd" if nth == 2 else ("rd" if nth == 3 > else "th")) > return str(day) + suffix > > > Output: > > >>> for day in range(1, 32): > print( nthSuffix(day)) > > 1st > 2nd > 3rd > 4th > 5th > 6th > 7th > 8th > 9th > 10th > 11st
Shouldn't this be 11th? And then 12th and 13th? Thank you. > 12nd > 13rd > 14th > 15th > 16th > 17th > 18th > 19th > 20th > 21st > 22nd > 23rd > 24th > 25th > 26th > 27th > 28th > 29th > 30th > 31st > > -----Original Message----- > From: Python-list <python-list-bounces+avigross=verizon....@python.org> On > Behalf Of Sayth Renshaw > Sent: Saturday, February 2, 2019 8:53 PM > To: python-list@python.org > Subject: Re: Implement C's Switch in Python 3 > > > > >I am trying to convert a switch statement from C into Python. (why? > > >practising). > > > > > >This is the C code. > > > > > >printf("Dated this %d", day); > > > switch (day) { > > > case 1: case 21: case 31: > > > printf("st"); break; > > > case 2: case 22: > > > printf("nd"); break; > > > case 3: case 23: > > > printf("rd"); break; > > > default: printf("th"); break; > > > > > > } > > > printf(" day of "); > > > > > >#Premise if the use enter an int as the date 21 for example it would > print 21st. It appends the correct suffix onto a date. > > >Reading and trying to implement a function that uses a dictionary. > > >Not sure how to supply list into it to keep it brief and with default > > >case of 'th'. > > > > > >This is my current code. > > > > > >def f(x): > > > return { > > > [1, 21, 31]: "st", > > > [2, 22]: "nd", > > > [3, 23]: "rd", > > > }.get(x, "th") > > > > > > > > >print(f(21)) > > > > > >I have an unhashable type list. Whats the best way to go? > > > > Skip has commented on lists being unhashable. We can elaborate on that > > if you like. > > > > However, even if you went to tuples (which would let you construct the > > dict you lay out above), there is another problem. > > > > You're looking up "x" in the dict. But the keys of the dict are not > > integers, they are lists (or tuples) or integers, so they won't match. > > > > You _could_ do this: > > > > return { > > 1: "st", 21: "st", 31: "st", > > 2: "nd", 22: "nd", > > 3: "rd", 23: "rd", > > }.get(x, "th") > > > > which makes distinct entries for each integer value of interest. > > > > The conventional approach would normally be: > > > > if x in (1, 21, 31): > > return "st" > > if x in (2, 22): > > return "nd" > > if x in (3, 23): > > return "rd" > > return "th" > > > > While this works for a small number of choices, if you had a huge dict > > with lots of possible values you could return to your > > dict-keyed-on-tuples approach. You would need to try each tuple in turn: > > > > mapping = { > > (1, 21, 31): "st", > > (2, 22): "nd", > > (3, 23): "rd", > > } > > for key, suffix in mapping.items(): > > if x in key: > > return suffix > > return "th" > > > > However, for big dictionaries (with many keys) you loose a key > > strength of dicts: constant time lookup. You can see the above code > > (and the earlier "if" code) are rather linear, with run time going up > > linearly with the number of keys. You're better with the int->string > > single value dict version. > > > > Cheers, > > Cameron Simpson > > It seems odd with C having switch that its cleaner and more efficient than > python where we are having to implement our own functions to recreate switch > everytime. > > Or perhaps use a 3rd party library like > https://github.com/mikeckennedy/python-switch > > You have both given good options, it seems there are no standard approaches > in this case. > > Cheers > > Sayth > > -- > https://mail.python.org/mailman/listinfo/python-list > > -- > https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list