Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何解决一个本应只移动0';s移到列表的末尾,但同时移动假值?_Python_Sorting - Fatal编程技术网

Python 我如何解决一个本应只移动0';s移到列表的末尾,但同时移动假值?

Python 我如何解决一个本应只移动0';s移到列表的末尾,但同时移动假值?,python,sorting,Python,Sorting,我正在编写一个函数来将0移动到列表的末尾,但是当列表中有一个False值时,它会将其转换为0并将其移动到末尾 我尝试了多种不同的if语句,包括: 如果i==0 如果类型(i)!=布尔和i==0 如果str(i)=“0” 在[0,1,None,2,False,1,0]的情况下,我希望函数返回[1,None,2,False,1,0,0],但它返回的是[1,None,2,1,0,0]。这里有两个问题。首先,在Python中,bool是int和False==0的子类,因此要区分0和False必须测试对象

我正在编写一个函数来将0移动到列表的末尾,但是当列表中有一个False值时,它会将其转换为0并将其移动到末尾

我尝试了多种不同的if语句,包括:

  • 如果i==0

  • 如果类型(i)!=布尔和i==0

  • 如果str(i)=“0”


  • [0,1,None,2,False,1,0]
    的情况下,我希望函数返回
    [1,None,2,False,1,0,0]
    ,但它返回的是
    [1,None,2,1,0,0]

    这里有两个问题。首先,在Python中,
    bool
    int
    False==0
    的子类,因此要区分
    0
    False
    必须测试对象的类型。此外,在迭代列表时修改列表肯定会导致“关闭”错误

    下面是一个简单而简单的实现:

    def move_zeros(seq):
        head, tail = [], []
        for v in seq:
            if isinstance(v, int) and not isinstance(v, bool) and v == 0:
                tail.append(v)
            else:
                head.append(v)
        return head + tail
    

    这里有几个陷阱。您已经了解的一点是,没有一种简单的方法可以区分
    0
    False
    。然而,还有另外两点:

  • 修改正在迭代的iterable(列表、dict等)是危险的。您应该避免这样做(除非您不能这样做,例如,对于无法在内存中复制的大量数据)
  • array.remove()
    的作用与您认为的不同。它可能与迭代循环中的元素处于同一位置,也可能不处于同一位置。负责将
    False
    转换为
    0
  • 考虑到这一点,这里有一个可行的版本:

    def is_integer_zero(x):
        # The cleanest way I found, but you could argue for other options
        return x == 0 and not isinstance(x, bool)
    
    def move_zeros(array):
        left_part = []
        right_part = []
    
        for i in array:
            if is_integer_zero(i):
                right_part.append(i)
            else:
                left_part.append(i)
    
        return left_part + right_part
    
    
    l = [0, 1, None, 2, False, 1, 0]
    
    print(move_zeros(l))  # [1, None, 2, False, 1, 0, 0]
    

    right\u部分
    完全由零组成,因此您可以简化代码/大大提高性能,但该版本的优点是您可以使用其他条件来选择右移的内容。

    谢谢,我还添加了or isinstance(v,float)对于可能的0.0值,我可以提供帮助-然后可以自由地对我的答案进行投票。你可能还想投票,接受勒波雷洛的答案,这个答案比我的答案更准确。我是个新手,一个小时前我就报名了,所以我对你和莱波雷洛的答案都投了赞成票,但我想当我还不到15分的时候,答案就不会出现了reputation@hubvoy感谢我们两人8-),请不要忘记接受leporello的答案,这个答案值得在这里标记为一个正确答案(记住,建立一个技术知识库,所以接受最好的解决方案对未来读者来说是很重要的)。好吧,接受这个答案只是在投票计数器下面勾选它。如果你想使它更通用,请考虑传递谓词函数(这里是代码> iSythigGrEZ0)作为一个回调。显然,对于OP的问题,完全超出了上限,但因为您提到了“使用其他条件”…;-)
    def is_integer_zero(x):
        # The cleanest way I found, but you could argue for other options
        return x == 0 and not isinstance(x, bool)
    
    def move_zeros(array):
        left_part = []
        right_part = []
    
        for i in array:
            if is_integer_zero(i):
                right_part.append(i)
            else:
                left_part.append(i)
    
        return left_part + right_part
    
    
    l = [0, 1, None, 2, False, 1, 0]
    
    print(move_zeros(l))  # [1, None, 2, False, 1, 0, 0]