Python中列表超出范围时返回特定值

Posted

技术标签:

【中文标题】Python中列表超出范围时返回特定值【英文标题】:Return specific value when list is out of range in Python 【发布时间】: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 来自哪里?如果输入错误,最好抛出异常。 【参考方案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 方法,我并没有挑剔他们的功能或它的作用。跨度>

以上是关于Python中列表超出范围时返回特定值的主要内容,如果未能解决你的问题,请参考以下文章

当我遍历我的列表时,返回列表索引超出范围

在Python中获取超出范围的索引默认值[重复]

我想异常处理“列表索引超出范围”。

Python循环:列表索引超出范围

如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误

KeyError:“likeCount”和IndexError:Python中的列表索引超出范围