I'm not sure if this is what you want, but dict.get might be the answer:
>>> ub_tries = 20 >>> tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'} >>> tries_dict.get(1, 'next') 'first' >>> tries_dict.get(4, 'next') 'fourth' >>> tries_dict.get(5, 'next') 'next' >>> tries_dict.get(20, 'next') 'last' >>> tries_dict.get(21, 'next') 'next'
Of course, you can wrap this in a function in various ways. For instance:
def name_try(try_number, ub_tries): tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'} return tries_dict.get(try_number, 'next')
In any case, dict.get(key, default=None) is similar to dict[key] , except that if key not a member, instead of raising a KeyError , it returns default .
As for your suggestions:
using range as key
Of course you can do this (if you are using Python 2 instead of 3, use xrange for range ), but how does this help?
d = { range(1, 5): '???', range(5, ub_tries): 'next', range(ub_tries, ub_tries + 1): 'last' }
This is completely legal, but d[6] is about to raise a KeyError because 6 is not the same as range(5, ub_tries) .
If you want this to work, you can build a RangeDictionary as follows:
class RangeDictionary(dict): def __getitem__(self, key): for r in self.keys(): if key in r: return super().__getitem__(r) return super().__getitem__(key)
But this is far beyond Python for Beginners, even for this terribly inefficient, incomplete, and unreliable implementation, so I would not suggest it.
find a way to generate a list with values ​​between 4 and ub_tries and use a list like the key
Do you mean this?
>>> ub_tries = 8 >>> tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'} >>> tries_dict.update({i: 'next' for i in range(5, ub_tries)}) >>> tries_dict {1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'next', 6: 'next', 7: 'next', 8: 'last'} >>> tries_dict[6] 'next'
This works, but it is probably not a good solution.
Finally, you can use defaultdict , which allows you to bake the default value in the dictionary, rather than passing it as part of every call:
>>> from collections import defaultdict >>> tries_dict = defaultdict(lambda: 'next', ... {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}) >>> tries_dict defaultdict(<function <lambda> at 0x10272fef0>, {8: 'last', 1: 'first', 2: 'second', 3: 'third', 4: 'fourth'}) >>> tries_dict[5] 'next' >>> tries_dict defaultdict(<function <lambda> at 0x10272fef0>, {1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'next', 8: 'last'})
However, note that this constantly creates each element the first time you request it, and you need to create a function that returns the default value. This makes it more useful for cases where you are going to update the values, and just want the default starting point.