<i id='c2r4d'><tr id='c2r4d'><dt id='c2r4d'><q id='c2r4d'><span id='c2r4d'><b id='c2r4d'><form id='c2r4d'><ins id='c2r4d'></ins><ul id='c2r4d'></ul><sub id='c2r4d'></sub></form><legend id='c2r4d'></legend><bdo id='c2r4d'><pre id='c2r4d'><center id='c2r4d'></center></pre></bdo></b><th id='c2r4d'></th></span></q></dt></tr></i><div id='c2r4d'><tfoot id='c2r4d'></tfoot><dl id='c2r4d'><fieldset id='c2r4d'></fieldset></dl></div>
  • <tfoot id='c2r4d'></tfoot>

        <legend id='c2r4d'><style id='c2r4d'><dir id='c2r4d'><q id='c2r4d'></q></dir></style></legend>
      1. <small id='c2r4d'></small><noframes id='c2r4d'>

        • <bdo id='c2r4d'></bdo><ul id='c2r4d'></ul>

        在 Python 中使用范围作为字典键,我有什么选择?

        use a range as a dictionary key in Python, what option do I have?(在 Python 中使用范围作为字典键,我有什么选择?)
        • <i id='8JVY3'><tr id='8JVY3'><dt id='8JVY3'><q id='8JVY3'><span id='8JVY3'><b id='8JVY3'><form id='8JVY3'><ins id='8JVY3'></ins><ul id='8JVY3'></ul><sub id='8JVY3'></sub></form><legend id='8JVY3'></legend><bdo id='8JVY3'><pre id='8JVY3'><center id='8JVY3'></center></pre></bdo></b><th id='8JVY3'></th></span></q></dt></tr></i><div id='8JVY3'><tfoot id='8JVY3'></tfoot><dl id='8JVY3'><fieldset id='8JVY3'></fieldset></dl></div>

          • <small id='8JVY3'></small><noframes id='8JVY3'>

            • <bdo id='8JVY3'></bdo><ul id='8JVY3'></ul>

            • <tfoot id='8JVY3'></tfoot>
              <legend id='8JVY3'><style id='8JVY3'><dir id='8JVY3'><q id='8JVY3'></q></dir></style></legend>

                  <tbody id='8JVY3'></tbody>
                1. 本文介绍了在 Python 中使用范围作为字典键,我有什么选择?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  这是我的第一篇文章,我对编程很陌生,所以我可能无法恰当地传达我的问题,但我会尽力而为!

                  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 ('
                  Come on make your ' + tries_dict.get(tries) + guess: ')
                  

                  这 3 个元素是我创建的猜数游戏的一部分,我将它们包含在一个 while 循环中,其中 tries += 1 在每个错误答案之后.

                  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.

                  如您所见,在我的字典中,前 4 个答案和游戏结束前最后可能的机会都有自定义值,所以这是我尝试做的:

                  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:

                  我想找到一种方法,让第四"和最后"之间的每个答案/键都有NEXT"值.

                  I wanted to find a way to have the 'NEXT' value for every answer/key between 'fourth' and 'last'.

                  如:

                  tries = 5
                  
                  Come on make your next guess
                  
                  tries = 6
                  
                  Come on make your next guess
                  

                  等等

                  我确实找到了一些复杂循环的方法,但作为好奇的类型,我想知道更有效/实用的方法来完成这个.

                  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:

                  1. 使用范围作为键
                  2. 找到一种方法来生成一个值介于 4 和 ub_tries 之间的列表并将该列表用作键
                  1. Using a range as a key
                  2. Finding a way to generate a list with values between 4 and ub_tries and 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!

                  推荐答案

                  我不确定这是否是你想要的,但是 dict.get 可能是答案:

                  I'm not sure whether this is what you want, but dict.get may 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 could wrap this up in a function, in various different ways. For example:

                  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')
                  

                  无论如何,dict.get(key, default=None) 类似于 dict[key],除了如果 key 是不是成员,而不是引发 KeyError,而是返回 default.

                  At any rate, dict.get(key, default=None) is like dict[key], except that if key is not a member, instead of raising a KeyError, it returns default.

                  至于你的建议:

                  使用范围作为键??

                  当然,您可以这样做(如果您使用的是 Python 2 而不是 3,请使用 xrange 表示 range),但它有什么帮助呢?

                  Sure, you can do that (if you're in Python 2 instead of 3, use xrange for range), but how would it help?

                  d = { range(1, 5): '???', 
                        range(5, ub_tries): 'next', 
                        range(ub_tries, ub_tries + 1): 'last' }
                  

                  这是完全合法的——但 d[6] 会引发 KeyError,因为 6 与 <代码>范围(5,ub_tries).

                  That's perfectly legal—but d[6] is going to raise a KeyError, because 6 isn't the same thing as range(5, ub_tries).

                  如果你想让它工作,你可以像这样构建一个 RangeDictionary:

                  If you want this to work, you could build a RangeDictionary like this:

                  class RangeDictionary(dict):
                      def __getitem__(self, key):
                          for r in self.keys():
                              if key in r:
                                  return super().__getitem__(r)
                          return super().__getitem__(key)
                  

                  但这远远超出了初学者的 Python",即使对于这种低效、不完整和不健壮的实现也是如此,所以我不建议这样做.

                  But that's well beyond "beginners' Python", even for this horribly inefficient, incomplete, and non-robust implementation, so I wouldn't suggest it.

                  找到一种方法来生成一个值在 4 到 ub_tries 之间的列表,并使用这样的列表作为键

                  finding a way to generate a list with values between 4 and ub_tries and using such list as a key

                  你的意思是这样的?

                  >>> 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'
                  

                  这可行,但它可能不是一个好的解决方案.

                  That works, but it's probably not as good a solution.

                  最后,您可以使用 defaultdict,它可以让您将默认值烘焙到字典中,而不是将其作为每次调用的一部分传递:

                  Finally, you could use defaultdict, which lets you bake the default value into the dictionary, instead of passing it as part of each 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 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.

                  这篇关于在 Python 中使用范围作为字典键,我有什么选择?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  What happens when you compare 2 pandas Series(当你比较 2 个 pandas 系列时会发生什么)
                  Quickly find differences between two large text files(快速查找两个大文本文件之间的差异)
                  Python - Compare 2 files and output differences(Python - 比较 2 个文件和输出差异)
                  Why do comparisions between very large float values fail in python?(为什么在 python 中非常大的浮点值之间的比较会失败?)
                  Dictionary merge by updating but not overwriting if value exists(字典通过更新合并,但如果值存在则不覆盖)
                  Find entries of one text file in another file in python(在python中的另一个文件中查找一个文本文件的条目)
                    <tbody id='vxLmh'></tbody>

                  <small id='vxLmh'></small><noframes id='vxLmh'>

                        <bdo id='vxLmh'></bdo><ul id='vxLmh'></ul>
                        <legend id='vxLmh'><style id='vxLmh'><dir id='vxLmh'><q id='vxLmh'></q></dir></style></legend>

                        1. <tfoot id='vxLmh'></tfoot>
                        2. <i id='vxLmh'><tr id='vxLmh'><dt id='vxLmh'><q id='vxLmh'><span id='vxLmh'><b id='vxLmh'><form id='vxLmh'><ins id='vxLmh'></ins><ul id='vxLmh'></ul><sub id='vxLmh'></sub></form><legend id='vxLmh'></legend><bdo id='vxLmh'><pre id='vxLmh'><center id='vxLmh'></center></pre></bdo></b><th id='vxLmh'></th></span></q></dt></tr></i><div id='vxLmh'><tfoot id='vxLmh'></tfoot><dl id='vxLmh'><fieldset id='vxLmh'></fieldset></dl></div>