Python删除相邻数字

Python删除相邻数字,python,Python,嗨,有人能解释一下为什么我的代码不起作用吗。对于输入[2,2,3,3,3],它输出[2,3,3],而不是[2,3]首先复制列表并对其进行迭代,否则迭代将失败并产生意外结果 # 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 cre

嗨,有人能解释一下为什么我的代码不起作用吗。对于输入[2,2,3,3,3],它输出[2,3,3],而不是[2,3]

首先复制列表并对其进行迭代,否则迭代将失败并产生意外结果

# 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):
  previous =''
  for i in nums:
    if i == previous:
      nums.remove(i)
    else:
      previous = i
  return nums

获取列表的副本并首先对其进行迭代,否则迭代将失败并产生意外结果

# 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):
  previous =''
  for i in nums:
    if i == previous:
      nums.remove(i)
    else:
      previous = i
  return nums

当您从正在迭代的列表中删除项时,就会出现问题。迭代的工作原理是这样的:列表中的每个索引从头到尾访问一次。删除某些内容时,列表的内容将向左移动:

def remove_adjacent(nums):
    previous = ''
    for i in nums[:]: # using the copy of nums
        if i == previous:
            nums.remove(i)
        else:
            previous = i
    return nums

>>> remove_adjacent([2,2,3,3,3])
[2, 3]
您可以通过手动迭代索引来解决此问题,只有在未进行删除时才可以前进:

def移除相邻(nums):
先前=“”
i=0;
而我
这避免了使用[:]制作列表的软拷贝(尽管这是另一种方法)


希望这有帮助

当您从正在迭代的列表中删除项时,问题就会出现。迭代的工作原理是这样的:列表中的每个索引从头到尾访问一次。删除某些内容时,列表的内容将向左移动:

def remove_adjacent(nums):
    previous = ''
    for i in nums[:]: # using the copy of nums
        if i == previous:
            nums.remove(i)
        else:
            previous = i
    return nums

>>> remove_adjacent([2,2,3,3,3])
[2, 3]
您可以通过手动迭代索引来解决此问题,只有在未进行删除时才可以前进:

def移除相邻(nums):
先前=“”
i=0;
而我
这避免了使用[:]制作列表的软拷贝(尽管这是另一种方法)


希望这有帮助

复制的复制的复制的复制的复制的复制的复制的复制的复制的复制的复制的复制的复制的复制的复制的Hi谢谢你的回答,你介意解释为什么切片创建一个副本的名单?另外,使用副本而不是原始列表的目的是什么我们正在迭代副本,因此当您修改原始列表时,您不会修改您迭代的副本。您好,谢谢您的回答,您介意解释为什么切片会创建列表的副本吗?另外,使用副本而不是原始列表的目的是什么我们正在迭代副本,因此当您修改原始列表时,您不会修改您迭代的副本。您好,谢谢您的回答!有一个小错误,虽然我认为你的意思是nums。删除(nums[I]),而不是nums。删除(I)哦,是的,当然!虽然你也可以使用list.pop(index):)嗨,谢谢你的回答!有一个小错误,虽然我认为你的意思是nums。删除(nums[I]),而不是nums。删除(I)哦,是的,当然!尽管您也可以使用list.pop(索引):)
| 1 | 2 | 3 | 4 | 5 |
      ^ index
| 1 | 2 | 4 | 5 | 
          ^ Oops! The iterator skips over the missing 3, and never gets to it.
def remove_adjacent(nums):
    previous = ''
    i = 0;
    while i < len(nums):
        if nums[i] == previous:
            nums.remove(i)
        else:
            previous = nums[i]
            i+=1
    return nums