在循环期间修改数组-Python

时间:2020-05-11 06:05:17

标签: python

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

我正在用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 个答案:

答案 0 :(得分:1)

前言

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

方法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 

答案 1 :(得分:0)

没关系,我必须将or条件更改为and和

答案 2 :(得分: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 is stableFalse被视为0True被视为1,如果需要,因此,由提供的功能标记为False的所有元素都以True <0开头并1结束。请注意,我使用is而不是==,因为False == 0的计算结果为True,而False is 0的计算结果不是。

答案 3 :(得分:-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))
相关问题