Python 无法移动0';s到列表的末尾
因此,这里的目标是将所有0移到数组的末尾,但我在这些小代码行中偶然发现了一个问题 当我使用输入时,我会得到所需的输出,如下所示: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
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,如果您相信列表中的所有内容都是数字;)我甚至没有接近这个解决方案。谢谢你!