将特定数字(无排序)移至列表左侧

我只想将零向左移动并且不想对列表进行排序。

例如,如果我的列表是这样的:

nums = [1, 10, 20, 0, 59, 63, 0, 8, 0]

这是将所有零向左移动后我想要的输出:

output = [0, 0, 0, 1, 10, 20, 59, 63, 8]

这是我试过的代码:

class Solution:
    def moveZeroes(self, nums):
        c = 0
        for i in range(len(nums)):
            if nums[i] != 0:
                nums[i], nums[c] = nums[c], nums[i]
                c += 1
        return nums
print(Solution().moveZeroes(nums))

这段代码给了我输出:

 [1, 10, 20, 59, 63, 8, 0, 0, 0]

但我想要的输出是:

[0, 0, 0, 1, 10, 20, 59, 63, 8]

回答

您可以使用sorted()with key asbool来实现这一点:

>>> nums = [1, 10, 20, 0, 59, 63, 0, 8, 0]

>>> sorted(nums, key=bool)
[0, 0, 0, 1, 10, 20, 59, 63, 8]

它适用于0s。为了使它对任何数字更通用,您可以将定义为lambda x: x!=left_num

>>> left_num = 0

>>> sorted(nums, key=lambda x: x!=left_num)
[0, 0, 0, 1, 10, 20, 59, 63, 8]

作为替代方案,这里有一个不那么Pythonic(但高效)的版本,它使用list.count()

>>> nums = [1, 10, 20, 0, 59, 63, 0, 8, 0]
>>> left_num = 0

>>> [left_num]*nums.count(left_num) + [n for n in nums if n!=left_num]
[0, 0, 0, 1, 10, 20, 59, 63, 8]

在这里,我找到列表中零的计数(例如n),并n在新列表的开头分配零。为了获得未排序列表的其余部分,我使用列表理解0从列表中过滤掉s。


以上是将特定数字(无排序)移至列表左侧的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>