0

我正在做一个编码问题,其目的是“编写一个函数,该函数采用一个值数组并将所有为零的元素移动到数组的末尾,否则保持数组的顺序。零元素也必须保持它们发生的顺序。”

我正在用 Python 测试我的代码,遇到了一个问题,我设置了一个条件以在找到 0 时忽略它们,但条件不起作用。是因为我正在修改循环中的列表,而没有考虑更新的值吗?我可以在没有额外空间的情况下处理这个吗?

def remove_zeros(array):
    for i in range(len(array)):
        if array[i] != 0 or array[i] != "0":
            c = array[i]
            print(c) #this is printing 0, but I'm setting condition to ignore 0's!
            for j in range(i, 0, -1):
                if array[j - 1] == 0 or array[j - 1] == "0":
                    temp = array[j]
                    array[j] = array[j - 1]
                    array[j - 1] = temp
    return array

input = [ 1, None, '5', '0', '2', 0, 8, 6, None, False ]
output = remove_zeros(input)
4

4 回答 4

1

前言

我们可以通过多种方式解决这个问题。

方法一:弹出/追加

此方法只是弹出当前元素并将其附加到末尾。这种方法确保它是相同的类型。

def remove_zeros(arr): 
    n = len(arr): 
    for i in range(n): 
        if arr[i] == 0 or arr[i] == '0': 
             # this will be a zero. 
             arr.append(arr.pop(i)) # remove and add it to the end. 
    return arr 

方法2:计算零的数量并覆盖它。

此方法假定您可以返回任何类型的零。

def remove_zeros(arr): 
    n = len(arr) 
    counter = 0 
    for i in range(n):
        if arr[i] != 0 and arr[i] != '0': 
           arr[counter] = arr[i] 
           counter += 1 
    while counter < n:  
        arr.append(0)
        counter += 1 
    return arr 
于 2020-05-11T06:15:58.123 回答
0

没关系,我不得不将 or 条件更改为 and

于 2020-05-11T06:45:18.417 回答
0

您可以通过sorted以下方式利用该任务:

ipt = [1, None, '5', '0', '2', 0, 8, 6, None, False]
opt = sorted(ipt, key=lambda x:x is 0 or x=='0')
print(opt)  # [1, None, '5', '2', 8, 6, None, False, '0', 0]

请注意,由于两个事实,这是可能的:sorted 是稳定的并且False被视为0, Trueas 1,如果出现这种需要,因此由提供的函数标记的所有元素都False将开始和True结束,如0< 1。请注意,我使用is而不是评估为==,而没有。False == 0TrueFalse is 0

于 2020-05-11T07:26:42.673 回答
-1

要从列表中删除项目,请使用内置的“过滤器”功能。例如,

def remove_zero(item):
    return item is not 0 and item!='0'

input  = [ 1, None, '5', '0', '2', 0, 8, 6, None, False ]
output = list(filter(remove_zero, input))
于 2020-05-11T06:17:13.153 回答