Вы обрабатываете только floats
и ints
- так что вы можете создать новый список из вашего ввода, если значение не равно 0:
arr = [9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9]
def move_zeros(array):
len_arr = len(array)
return ([ x for x in array if x != 0.0]+[0]*len_arr)[:len_arr]
# equivalent non-listcomprehension but simple for loop
def m_z(arr):
k = []
tmp = []
for e in arr:
if e/1.0 != 0.0:
k.append(e)
else:
tmp.append(0)
return k+tmp
print(move_zeros(arr))
Вывод:
[9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Если x
является только целым числом 0
и -0
может привести к 0.0
- если x
является числом с плавающей запятой, только 0.0
и -0.0
могут привести к 0.0 - просто не помещайте их ввыход..copy()
не нужен, потому что понимание списка уже копируется для вас.
Проверка для интергеров и is
работает, потому что python кэширует целые числа от -5 до 256 или около того - все они получают одинаковые id()
и, следовательно, is
«кажется» работает.
Используйте is
только для None
чеков или, если вы знаете, что делаете, никогда не для чисел.
Если вы хотите оставить не (ìnt,float
) нетронутыми, вы можете проверить дляэто тоже:
arr = [9,0.0,0,False,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9]
def move_zeros(array):
len_arr = len(array)
return ([ x for x in array if type(x) not in {int,float} or
x != 0.0]+[0]*len_arr)[:len_arr]
# [9, False, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Подробнее:
Небольшая проверка работоспособности:
k = 365
i = 365 // 5 * 5 # if you do i = 365 only, they are ==/is True, this way: they are not
for elem in [0,False,k]:
for olem in [0,False,i]:
print(f"{str(elem):>8} is {str(olem):<10}: {str(elem is olem):<10} ")
print(f"{str(elem):>8} == {str(olem):<10}: {str(elem == olem):<10} ")
Выход:
0 is 0 : True
0 == 0 : True
0 is False : False
0 == False : True
0 is 365 : False
0 == 365 : False
False is 0 : False
False == 0 : True
False is False : True
False == False : True
False is 365 : False
False == 365 : False
365 is 0 : False
365 == 0 : False
365 is False : False
365 == False : False
365 is 365 : False # k is i
365 == 365 : True # k == i