This is my first post and I’m quite new at programming, so I might not be able to convey my question appropriately, but I’ll do my best!
tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
ub_tries = user input
tries = 1
input ('\nCome on make your ' + tries_dict.get(tries) + guess: ')
These 3 elements are part of a number guess game I created, and I included them in a while loop where tries += 1 after each wrong answer.
As you can see, in my dictionary there are custom values for the first 4 answers and the last possible chance before the game is over, so here is what I tried to do:
I wanted to find a way to have the ‘NEXT’ value for every answer/key between ‘fourth’ and ‘last’.
As in:
tries = 5
Come on make your next guess
tries = 6
Come on make your next guess
and so on
I did find a way with some complex looping, but being the curious type I wanted to know of more efficient/practical ways to accomplish this.
Here are some options i thought about but couldn’t get to work:
- Using a range as a key
- Finding a way to generate a list with values between 4 and
ub_triesand using that list as a key
So generally speaking: how can one create a way to have this general answer (next or whatever) for keys that aren’t specified in a dictionary?
Any feedback would be greatly appreciated, feel free to ask for clarifications since I can tell myself my question is kind of messy.
I hope I get more crafty both at programming and asking related questions, so far my programming is nearly as messy as my summary skills, sigh!
I’m not sure whether this is what you want, but
dict.getmay be the answer:Of course you could wrap this up in a function, in various different ways. For example:
At any rate,
dict.get(key, default=None)is likedict[key], except that ifkeyis not a member, instead of raising aKeyError, it returnsdefault.As for your suggestions:
Sure, you can do that (if you’re in Python 2 instead of 3, use
xrangeforrange), but how would it help?That’s perfectly legal—but
d[6]is going to raise aKeyError, because6isn’t the same thing asrange(5, ub_tries).If you want this to work, you could build a
RangeDictionarylike this:But that’s well beyond “beginners’ Python”, even for this horribly inefficient, incomplete, and non-robust implementation, so I wouldn’t suggest it.
You mean like this?
That works, but it’s probably not as good a solution.
Finally, you could use
defaultdict, which lets you bake the default value into the dictionary, instead of passing it as part of each call:However, note that this permanently creates each element the first time you ask for it—and you have to create a function that returns the default value. This makes it more useful for cases where you’re going to be updating values, and just want a default as a starting point.