在python中,如何将0移到列表的末尾而不是False

在python中,如何将0移到列表的末尾而不是False,python,Python,我的结果是[1,1,2,1,3,'a',False,0,0] 我不希望False移动,我的程序将False视为0 您可以将False另存为字符串。那么它不被视为0。 将代码更改为: def move_zeros(array): for element in array: if element == 0 and type(element) is not bool: array.append(array.pop(array.index(element)

我的结果是
[1,1,2,1,3,'a',False,0,0]

我不希望False移动,我的程序将False视为0

您可以将False另存为字符串。那么它不被视为0。 将代码更改为:

def move_zeros(array):
    for element in array:
        if element == 0 and type(element) is not bool:
            array.append(array.pop(array.index(element)))
    return array

print(move_zeros([False,1,0,1,2,0,1,3,"a"]))

之所以会出现这种情况,是因为您在循环列表时对列表进行操作,以及您正确识别的问题,
False==0
0==0
在Python中都是
True
。处理此问题的一种方法是使用
is
而不是
=
来检查与
0
的相等性:

print(move_zeros(["False",1,0,1,2,0,1,3,"a"]))
输出:

def move_zeros(a):
    return [x for x in a if x is not 0] + [x for x in a if x is 0]

print(move_zeros([False,1,0,1,2,0,1,3,"a"]))
请注意,使用
is
来比较整数通常是不安全的,因为范围(-5,256)之外的整数具有彼此不同的ID()。然而,在我们的例子中,我们只是使用
0
,因此上述解决方案是安全的。

更改:

[False, 1, 1, 2, 1, 3, 'a', 0, 0]
致:


它更长,但它解决了您的问题

这会将“零”替换到末尾,消耗O(1)个空间和O(n)个时间复杂性

not element == False and not element == True

您可以使用
pop()
+
append()
,只需使用一个“free counting”循环即可,该循环主要是
,而

def move_zeroes_to_end(nums):
    n = len(nums)
    non_zero = 0
    for i in range(n):
        if nums[i] != 0 or type(nums[i])==bool:
            nums[non_zero],nums[i] = nums[i],nums[non_zero]
            non_zero +=1
    return nums


l=[False,1,0,1,2,0,1,3,"a"]

print(move_zeroes_to_end(l)) #Output:[False, 1, 1, 2, 1, 3, 'a', 0, 0]

这是我的实现,使用带循环的计数器:

[False, 1, 1, 2, 1, 3, 'a', 0, 0]
输出

def move_zeros(array):
    result, count = [], 0
    for i in array:
        if i == 0 and type(i) == int: count+= 1
        else: result.append(i)
    return result + [0]*count

print(move_zeros([False,1,0,1,2,0,1,3,"a"]))

简单的解决方案,并表明您的支票实际上没有问题:

[False, 1, 1, 2, 1, 3, 'a', 0, 0]
或者与
False
singleton比较:

>>> sorted(array, key=lambda x: x == 0 and type(x) is not bool)
[False, 1, 1, 2, 1, 3, 'a', 0, 0]
或者,如果你觉得好玩,被链子拴住的比较:

>>> sorted(array, key=lambda x: x == 0 and x is not False)
[False, 1, 1, 2, 1, 3, 'a', 0, 0]

Python在哪里保证只有一个
0
对象?例如,它不适用于666。在
a=[666]
之后,
[x代表x,如果x是666]
给了我
[]
,因为列表理解中的
666
对象与列表中的对象不同。@CDJB这不仅仅是一个旁白,我建议在你的答案中添加该信息(以及一个安全的替代方案)。我也不知道非CPython实现如何处理小整数。@CDJB我看不出有什么保证。只有“当前实现”(CPython)这样做的声明。这不安全,绝对不是正确的解决方案。您永远不应该依赖这样的实现细节,这不是保证。它可以在不同版本的Python中改变,见鬼,即使是不同的微级别也无法改变这一点。完全错了。此解决方案不安全。请注意,前面的一段指出,“对于不可变类型,计算新值的操作实际上可能返回对具有相同类型和值的任何现有对象的引用”,并给出了一个示例:“在
a=1之后;b=1
a
b
可能引用值为1的同一对象,也可能不引用,具体取决于实现“。事实上,与小整数进行身份比较是不安全的。原始代码段是正确的,而您的代码段是错误的。问题在别处。答案忽略了告诉你的是你的条件逻辑是正确的。即使
元素
0,也会被匹配
False
数组索引(元素)
绊倒。如果你要建立一个新的列表,而不是改变原来的列表,那么你的代码就可以工作了。这能回答你的问题吗?不过,这会改变不同零的顺序。例如,
[0,0.0,1]
变成了
[1,0.0,0]
。但也许没关系。哦,是的,我错过了那个案例,我想我们可能需要两次通过阵列来完成这个任务?你能用两次通过来完成吗?还有O(1)和O(n)吗?我不知道一个简单的方法。请问这段代码中使用的sorted()函数是什么?@AchebePeter我正在根据元素是否为零对它们进行排序。
>>> sorted(array, key=lambda x: x == 0 and type(x) is not bool)
[False, 1, 1, 2, 1, 3, 'a', 0, 0]
>>> sorted(array, key=lambda x: x == 0 and x is not False)
[False, 1, 1, 2, 1, 3, 'a', 0, 0]
>>> sorted(array, key=lambda x: 0 == x is not False)
[False, 1, 1, 2, 1, 3, 'a', 0, 0]