On 02Feb2019 16:47, Sayth Renshaw <flebber.c...@gmail.com> wrote:
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 <c...@cskk.id.au>
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to