【问题标题】:IndexError - Using Python 3.4.3IndexError - 使用 Python 3.4.3
【发布时间】:2018-08-10 23:06:45
【问题描述】:

我正在尝试为一个小程序编写代码,该程序将列表作为输入并返回一个布尔值,指示是否有任何连续重复的数字(列表必须至少有 2 个元素)。我不断收到以下错误:

IndexError: list index out of range.

任何有关如何解决此问题的建议将不胜感激!

def two_length_run(n):

    i = 0

    while i < len(n):
        if len(n) >= 2:
            if (n[i] == n[i + 1]) and (n[i + 1] <= len(n)):
                return True
            else:
                i = i + 1
        else:
            return False

【问题讨论】:

  • 问题出在第二个 if 条件下。如果 i+ 1
  • @emlauren 您正在经历 ilen(n)。当i 处于最大价值时,您认为n[i + 1] 会发生什么?

标签: python loops while-loop boolean


【解决方案1】:
  1. 根据列表的长度检查下一个元素没有帮助;你需要检查下一个 index ...
  2. ...并在访问元素之前执行此操作。
  3. 您需要防止它越界。长度为 k 的列表的索引为 0:(k-1),但您的测试允许 i+1 运行到 k 的值,这会导致您的访问超出范围。

新检查:注意从&lt;=&lt; 的更改,并颠倒顺序。

if i + 1 < len(n) and n[i] == n[i+1]:

“短路”确保如果第一个条件为假,则不会评估第二个条件。

您可以使用for 循环更轻松地做到这一点,这有助于将您的 idex 保持在界限内:

if len(n) >= 2:

    for i in range(len(n)-1):
        if n[i] == n[i + 1]:
            return True           # Exit early if you find a pair

return False    

【讨论】:

  • 您可能希望在range 上为 OP 链接文档。 for 循环是一个很好的解决方案(并且避免了忘记增加 i 的可能性)
  • @Prune 这个解释非常有帮助——非常感谢! :)
【解决方案2】:

我会这样写:

def two_length_run(n):
    if not n or len(n) < 2:
        return False
    for i in xrange(len(n) - 1):
        if n[i] == n[i+1]:
            return True 
    return False

在开始迭代和使用 xrange 之前进行检查(快速退出),而不必手动增加“i”。

【讨论】:

  • 错误检查??这是什么,生产代码? :) 严肃地说,良好的检查并且易于阅读和理解(尽管range/xrange 的行为不包括扩展范围内的最大值对于新编码人员来说可能不直观)。
【解决方案3】:
def two_length_run(n):
    i = 0
    while i < len(n):
        if len(n) >= 2:
            if (i + 1 < len( n )) and ( n[i] == n[i + 1]) and (n[i + 1] <= len(n)):
                return True
            else:
                i = i + 1
        else:
            return False

当i = len( n ) - 1时,由于i + 1,内部if条件可能会溢出,因此在此处添加检查。

【讨论】:

    【解决方案4】:

    您的循环同时检查当前索引和下一个索引,因此您的 while 条件不正确。

    代替

    while i < len(n):
        if len(n) >= 2:
    

    使用

    if len(n) > 1:
        while i < len(n) - 1:
            if n[i] == n[i + 1]:
                return True
            i = i + 1
    
    # Checked every index of n without a duplicate
    return False
    

    将避免此索引错误。

    【讨论】:

      【解决方案5】:

      您得到的答案似乎是正确的。但是,我认为将条件放在 while 语句中更简洁。

      def two_length_run(n):
      
          i = 0
      
          while i < len(n) - 1:
              if len(n) >= 2:
                  if (n[i] == n[i + 1]) and (n[i + 1] <= len(n)):
                      return True
                  else:
                      i = i + 1
              else:
                  return False
      

      我觉得应该可以

      【讨论】:

        猜你喜欢
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        相关资源
        最近更新 更多