【问题标题】:Return specific value when list is out of range in PythonPython中列表超出范围时返回特定值
【发布时间】:2018-03-31 10:36:28
【问题描述】:

如果列表超出范围,如何返回特定值?这是我到目前为止的代码:

def word(num):
  return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][num-1]

word(1) 将返回'Sunday',但是如果num 不是1-7 之间的整数,我该如何返回默认值?

因此,word(10) 将返回类似 "Error" 的内容。

【问题讨论】:

  • num 来自哪里?如果输入错误,最好抛出异常。

标签: python arraylist return range default


【解决方案1】:

它应该处理不在您想要的范围内的任何整数。

daysofweek = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
def getday(num, len_range):
    if 0 < num <= len_range:
        return daysofweek[num - 1]
    else:
        return "Error"

num_index = int(input("Enter a value for num : "))
print(getday(num_index, len(daysofweek)))

您也可以将getday() 写成这样的紧凑形式:

def getday(num, len_range):
    return daysofweek[num - 1] if 0 < num <= len_range else "Error"

【讨论】:

    【解决方案2】:

    您可以使用enumerate(sequence, start=1) 将您的列表转换为字典:

    dict(enumerate(['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'], 1))
    # {1: 'Sunday', 2: 'Monday', 3: 'Tuesday', 4: 'Wednesday', 5: 'Thursday', 6: 'Friday', 7: 'Saturday'}
    

    那么,您的查询就像dict.get() 一样简单:

    wdays = {1: 'Sunday', 2: 'Monday', 3: 'Tuesday', 4: 'Wednesday', 5: 'Thursday', 6: 'Friday', 7: 'Saturday'}
    
    def word(num):
        return wdays.get(num, 'Error')
    

    这是一个例子:

    >>> word(3)
    'Tuesday'
    >>> word(10)
    'Error'
    >>> word('garbage')
    'Error'
    

    根据您要对字符串执行的操作,返回 'Error' 而不是简单地抛出错误可能不是一个好主意。否则,每次使用此函数时,您都必须检查字符串是否看起来像工作日或等于'Error'

    【讨论】:

    • 这种方法的另一个好处是,如果 word 传递了 any 错误参数,它也会返回“错误”,而不仅仅是超出范围的整数。跨度>
    • @PM2Ring:是的。但这取决于目标是什么。通常最好在使用错误输入时立即抛出异常,而不是尝试继续处理损坏的数据。如果我喜欢这种行为,我会写 Javascript 而不是 Python ;)
    • 确实如此。在错误的参数上引发 ValueError 而不是返回“错误”会是更好的设计。 OTOH,字符串测试比异常处理便宜。
    【解决方案3】:

    只需将您想要的内容翻译成 Python:

    def word(num):                                                                  
       return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][num-1] if 1 <= num <= 7 else 'Error'
    

    【讨论】:

      【解决方案4】:

      普通的if/else 就足够了。

      def word(num):
          l = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
          return l[num-1] if 0<num<=len(l) else "Error"
      

      #驱动代码

      >>> word(7)
      => 'Saturday'
      
      >>> word(8)
      => 'Error'
      
      >>> word(-10)
      => 'Error'
      

      【讨论】:

      • 每次调用都很复杂,可能他需要多次调用,所以使用自己的方法和自己的行为要好得多。但它有效——你是对的。
      • return l[num-1] if len(l) &gt;= num &gt; 0 else "Error"
      【解决方案5】:

      使用带有try-except 的高度pythonic EAFP 方法。

      daysofweek = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
      def getday(num):
          try:
              return daysofweek[num - 1]
          except IndexError:
              return "Error"
      

      【讨论】:

      • 它不适用于negative 值或0。将回到最后。
      • @KaushikNP 的理解是 OP 输入了一个介于 1 和 8 之间的值。我只是向他们展示如何使用 eafp 方法,我并没有挑剔他们的功能或它的作用。跨度>
      猜你喜欢
      • 2019-01-27
      • 2011-05-20
      • 1970-01-01
      • 2020-04-04
      • 2015-03-03
      • 2021-10-22
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多