无法将0#正确地移动到列表末尾

时间:2018-05-22 06:25:12

标签: python

所以这里的目标是将所有0移到数组的末尾,但我偶然发现了这些小行代码的问题。

当我使用输入时,我得到了所需的输出:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

但是,每当我使用此输入时:

[0,0,1]

我得到了这个输出:

[0,1,0]

当我想要输出时:

[1,0,0]

我不知道为什么我认为我正确实现了这一点:

class Solution:
def moveZeroes(self, nums):
    """
    :type nums: List[int]
    :rtype: void Do not return anything, modify nums in-place instead.
    """
    for counter in range(len(nums)):
        if nums[counter] == 0:
            nums.pop(counter) #Remove the 0
            nums.append(0) #Add to end. 
            counter-=1 #Check same index just incase adjacent 0

任何输入都表示赞赏。谢谢!

3 个答案:

答案 0 :(得分:5)

我甚至不想打扰循环手册......

def move_zeroes(nums):
    nums[:] = [n for n in nums if n != 0] + [0] * nums.count(0)

x = [0,1,0,3,12]
move_zeroes(x)
print(x)

输出

[1, 3, 12, 0, 0]

答案 1 :(得分:4)

for循环不等同于具有增量的while循环。您的最后一行counter-=1没有达到任何效果:在您递减counter后,它会立即获取该范围中的下一个值。 (要明确的是,如果您在迭代counter = 2,例如,无论您在此迭代结束时离开counter的值是什么,它将在下一次重新分配给3迭代。)

答案 2 :(得分:3)

这一行:

counter-=1 #Check same index just incase adjacent 0

不会减少跟随索引的索引。

请改为尝试:

class Solution:
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        zeros_found = 0
        for counter in range(len(nums)):
            idx = counter - zeros_found
            if nums[idx] == 0:
                nums.pop(idx) #Remove the 0
                nums.append(0) #Add to end. 
                zeros_found += 1 #Account for offset

你也可以在功能上做得更多:

from itertools import filterfalse
# ...
def moveZeroes(self, nums):
    none_zeroes = list(filter(None, nums))
    zeros = list(filterfalse(None, nums))
    return none_zeros + zeros

或者,如果您不想无缘无故地创建列表:

from itertools import filterfalse, chain
# ...
def moveZeroes(self, nums):
    none_zeroes = filter(None, nums)
    zeros = filterfalse(None, nums)
    return list(chain(none_zeros, zeros))

这些依赖于两个隐含的事实:

  1. bool(0)False,而bool(x)x != 0时为True
  2. filter(None, list)按项目bool值过滤,因此没有0(而filterfalse则相反)