Python 无法移动0';s到列表的末尾

Python 无法移动0';s到列表的末尾,python,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

因此,这里的目标是将所有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
欢迎您的任何意见。谢谢

这一行:

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))
这取决于两个隐含的事实:

  • bool(0)
    False
    ,当
    x!=0
  • filter(无,列表)
    按项的
    bool
    值筛选列表,因此没有0(filterfalse则相反)

  • for
    循环不等同于
    while
    带增量的循环。您的最后一行
    计数器-=1
    没有实现任何功能:在您减少
    计数器
    后,它立即获取范围内的下一个值。(需要明确的是,如果您在迭代
    counter=2
    ,例如,无论您在该迭代结束时留下
    counter
    的值是什么,它都将在下一次迭代时重新分配给
    3

    我甚至不会为循环手册而烦恼

    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]
    

    有一种更简单的方法:
    x=[1,5,6,0,4]
    和排序列表:
    x.sort(reverse=True)
    @J.A.Cado这不是一回事。它将对所有值进行排序,而不仅仅是将零分流到末尾。
    [n表示n,如果n]
    较短:)@Jean-Françoisfare-Sure,如果您相信列表中的所有内容都是数字;)我甚至没有接近这个解决方案。谢谢你!