0

这是任务:

编写一个算法,该算法采用一个数组并将所有零移动到末尾,保留其他元素的顺序

这段代码有什么问题?为什么在遍历列表并删除零时不保留布尔值?是因为False等于0吗?

move_zeros([False,1,2,0,1,0,1,0,3,0,1])

def move_zeros(array):
    count=0
    for num in array:
        if num == 0:
            count +=1
            array.remove(0)
            
    return array +[0]*count
4

5 回答 5

2

是的,False == 0True在 Python 中评估为,这就是False从数组中删除值的原因。

在 Python 中,True并被False实现为单例,这意味着所有False值都指向同一个实例。因此,您可以使用is运算符来检查一个值是否完全等于这个单例。

False is 0会回来False,一会儿False == 0会回来True

于 2020-06-19T17:09:25.073 回答
0

您的代码中有两个问题:

  1. 直接改变了你迭代的列表——它总是很危险的。
  2. 其他答案向您解释了为什么False == 0True.

我对您的代码进行了尽可能少的更改,以解决这些问题:

  1. 我创建了一个新的空数组,而不是从原始列表中删除“坏”元素,而是将“好”元素附加到该新数组中。

  2. 我也测试了当前元素的类型。


def move_zeros(array):
    count=0
    new_array = []
    for num in array:
        if num == 0 and type(num) is int:
            count +=1
        else:
            new_array.append(num)

    return new_array + [0]*count

测试:

move_zeros([False,1,2,0,1,0,1,0,3,0,1])
[False, 1, 2, 1, 1, 3, 1, 0, 0, 0, 0]
于 2020-06-19T17:48:13.703 回答
0
x = len(lis)
y = []
for i in range(len(lis)):
    if lis[i]!=0:
        y.append(lis[i])
if len(y)!=len(lis):
    z = len(lis)-len(y)
    for i in range(z):
        y.append(0)

似乎这是一个家庭作业问题。很高兴能帮助你。

编辑:使用 print(y) 你会得到你想要的

于 2020-06-19T16:53:55.817 回答
0

是的,确实False == 0。实际上,bool是 的子类型int。如果要严格比较 if Falseis equal to 0,则应在if语句中添加另一个比较。

此外,不要在迭代自身时修改列表。而是创建一个新的。

def move_zeros(list_):
    result = []
    zeros = 0
    for item in list_:
        if item == 0 and type(item) == int:
            zeros += 1
            continue
        result.append(item)
    return result + [0] * zeros

于 2020-06-19T17:19:58.450 回答
0

是 0 评估为 False,1 评估为 True,使用这个

def move_zeros(obj):
    new_list = []
    zeros_list = []
    for item in obj:
        if item != 0 or is False:
            new_list.append(item)
        else:
            zeros_list.append(item)
    new_list.extend(zero_list)
    return new_list

这会将所有非 0 添加到一个列表,将所有 0 添加到另一个列表,然后在遍历 zeros_list 并将它们添加到 new_list 的末尾后返回 new_list

于 2020-06-19T17:23:58.447 回答