3

来自 Google 的 Python 类

#!/usr/bin/python -tt
# Copyright 2010 Google Inc.
# Licensed under the Apache License, Version 2.0
# http://www.apache.org/licenses/LICENSE-2.0

# Google's Python Class
# http://code.google.com/edu/languages/google-python-class/

# Additional basic list exercises

# D. Given a list of numbers, return a list where
# all adjacent == elements have been reduced to a single element,
# so [1, 2, 2, 3] returns [1, 2, 3]. You may create a new list or
# modify the passed in list.
def remove_adjacent(nums):
  x = 0
  newlist = []
  for x in range(0,len(nums),1):
    if nums[x] == nums[x+1]:
      newlist.append(nums[x])
      x = x+2
    else:
      newlist.append(nums[x])
      x = x+1

  return nums

它给我一个错误,说列表索引超出范围,但我不确定出了什么问题。我在某处读到,在使用 for 循环进行迭代时无法替换列表中的值,但不知道如何解决。任何意见,将不胜感激。

4

4 回答 4

4

可能是因为nums[x+1]超出范围。x仅从0len(nums) - 1意味着当xis时len(nums)-1,您实际上将索引到nums[len(nums)]哪个将是结束后的一个nums(请记住,非空列表中的最后一个索引1小于它的长度,因为我们从 开始计算索引0)。

于 2013-06-14T02:01:53.557 回答
2

您也可以使用 zip 和列表推导来做到这一点:

def remove_adjacent(nums):
    return [n[0] for n in zip(nums, nums[1:]) if n[0] != n[1]]
于 2013-06-14T02:27:14.933 回答
2

当 x 是最后一个元素的索引时,索引x+1将超出范围。此外,您正在创建一个新列表,但您返回旧列表。

修改 的值x并没有按照您的想法进行,因为它在每次循环迭代时都会被重置。

这是一个替代实现:

def remove_adjacent(nums):
  newlist = []
  for i in range(0, len(nums)):
    if i == len(nums) - 1:      # Avoid out of range error.
      newlist.append(nums[i])
    elif nums[i] == nums[i+1]:  # Skip until the last repeat
      continue
    else:  
      newlist.append(nums[i])
  return newlist    
于 2013-06-14T02:12:25.937 回答
2

列表的最后一个元素的索引x+1超出范围,其索引为len(nums)-1- 没有nums[len(nums)].

只使用模块groupby()中的函数真的很简单itertools

from itertools import groupby

def remove_adjacent(nums):
    return [k for k, _ in groupby(nums)]

print remove_adjacent([1, 2, 2, 2, 3])

输出:

[1, 2, 3]
于 2013-06-14T02:49:59.853 回答