大体思路和代码
刚开始读题的时候很快就有了思路:每一轮用list的index方法找到第一个为0的元素的索引,然后将该元素弹出(pop),在将其添加(append)在列表末尾。于是我很快写出了代码并进行test,但是发现出现了2个结果报错。
我一看,嗷,原来是佐田……咳咳,原来是这两个test案例中提供的数组包含元素False,而False所属的bool数据类型实际上是int的一个子类(subclass),所以代码在整理数组时会把False也搬运到末尾,但是根据该题目的要求,False不应该算作0。
于是,我的解决思路变为了:另外编写一个函数判断某一元素是否为0且不为False,该函数主要是利用type方法进行判断。然后在move_zeros函数里进行遍历,但是遍历顺序应为倒序(具体原因大家可以自己体会),然后将每次遇到的0元素弹出并加在列表末尾。
代码如下:
# -*- coding: utf-8 -*-
"""
codewars Kata: Moving Zeros To The End
Created on Mon Nov 30 08:11:46 2020
@author: Pray
"""
def is_zero(v):
return type(v) in (int,float) and not v
def move_zeros(array):
for i in reversed(range(len(array))):
if(is_zero(array[i])):
array.append(array.pop(i))
return array
大神的解决方案
接下来让我们鉴赏一下大神们的解决方案叭
大神方案一
def move_zeros(arr):
l = [i for i in arr if isinstance(i, bool) or i!=0]
return l+[0]*(len(arr)-len(l))
第一位大神利用了isinstance函数,先将列表中所有0元素剔除出去,然后在列表后面添加相应个数的0元素,代码非常的简洁易懂啊,间置amazing。
大神方案二
def move_zeros(array):
return sorted(array, key=lambda x: x==0 and type(x) is not bool)
如果说第一位大神的代码更为简洁,那第二位大神的代码就更富于技巧性了。这位大神的lambda函数用得非常熟练。
lambda函数的用法不过多介绍啦,sorted函数的具体用法我确实是不太熟练,大家可以看看下面这个链接中的介绍,非常详细:
Python sorted函数详解(高级篇)