【问题标题】:Python Index Error (unexpected) List append functionPython索引错误(意外)列表追加功能
【发布时间】:2014-07-19 08:59:24
【问题描述】:

谁能告诉我为什么这段代码给我一个索引错误? 非常感谢任何帮助。

def remove_adjacent(nums):
    new = []    
    for i in range(0, (len(nums)-1)):
        if nums[i] != nums[(i+1)]:
            new.append(nums[i])
    new.append(nums[-1]) #this is what causes the index error
    return new

【问题讨论】:

  • 这只会在一种情况下发生:nums = [](或()""等)。

标签: python list python-2.7 append


【解决方案1】:

正如 jonrsharpe 所说,您的 remove_adjacent 函数无法处理一个条件:nums 是空的 listtuple 或某些数组类型支持按索引进行随机访问。

您必须处理最后一个元素(nums[-1]),尤其是因为在您的算法中最后一个元素之后没有要比较的元素。

我认为这也许是实现remove_adjacent 函数的更简洁的方式:

def remove_adjacent(nums):
    new = []    
    for i in nums:
        if not new or new[-1] != i:
            new.append(i)
    return new

这样就不用特别处理最后一个元素了。

【讨论】:

    【解决方案2】:

    如果您将空序列传递给@remove_adjacent,这将失败。比如 remove_adjacent([])

    看看这个,我只是重写它。

    def remove_adjacent(nums):
        new = []    
        for i in range(0, len(nums)-1):
            if nums[i] != nums[(i+1)]:
                new.append(nums[i])
        if len(nums):new.append(nums[-1]) # it works
        return new
    

    【讨论】:

      【解决方案3】:

      为了完全避免该问题并使其适用于任何可迭代的序列,而不仅仅是序列,您可以使用itertools.groupby()

      from itertools import groupby
      
      
      def remove_adjacent(items):
          return [item for item, _ in groupby(items)]
      

      【讨论】: