Форум сайта python.su
1
Добрый вечер! Подскажите, что я упускаю?
Задача: написать функцию, которая получает список и переставляет все нули в нем в конец.
Например,
move_zero((“c”,“d”,0,1,False,0,1)) должна вернуть ('c', ‘d’, 1, False, 1, 0, 0).
a = [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): zIndex = [] zCount = 0 for i in array: if i is not 0 and i is not 0.0: zIndex.append(i) else: zCount += 1 return zIndex + [0]*zCount print(move_zeros(a))
c = [] for i in a: if i is not 0 and i is not 0.0: c.append(i) print(c)

Отредактировано Roiser (Май 13, 2020 20:49:54)
Офлайн
76
Это не то что тебе надо в данной ситуации. Подробнее можешь почитать тут
Используй !=
if i != 0 and i != 0.0:
if i not in [0, 0.0]:
Офлайн
1
Да, я как раз подобное прочитал перед тем, как начать писАть)) В списке, который передают функции есть элементы False (а также могут быть {}, пустой список, None), которые должны остаться на местах. Я так понял, это задача на понимание разницы между 0, 0.0 и False. Не придумал, как удалить нули и оставить False через операторы сравнения, поэтому использовал is.
Но все же, почему оно по-разному работает с одинаковым логическим выражением?
Отредактировано Roiser (Май 13, 2020 22:35:33)
Офлайн
124
def move_zero(list): for i in list: if i == 0: list.remove(i) list.append(i) a = [9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9] move_zero(a) print(a)
Офлайн
1
xam1816Это было моим первым решением, но не работает, если в списке есть элемент False.
move_zero((“c”,“d”,0,1,False,0,1)) должна вернуть ('c', ‘d’, 1, False, 1, 0, 0).Мне что-то подсказывает, что нельзя менять изначальный список…

Отредактировано Roiser (Май 14, 2020 00:16:38)
Офлайн
186
> То есть 0.0 тоже попадают в список без нулей.
Значения типа int кэшируются в небольшом диапазоне, по этому для значений из этого диапазона сравнение через is будет работать, но такое сравнение не будет работать для других типов. Попробуй использовать проверку типов в условии:
if not i and type(a) in (int,float): .....
Отредактировано Rodegast (Май 14, 2020 12:12:18)
Офлайн
124
Roiserу тебя в функции круглые скобки,что означает кортеж,который менять нельзя,
def move_zero(list):
for i in list:
if i == 0:
list.remove(i)
list.append(i)
return list
print (move_zero(["c","d",0,1,False,0,1]))
D:\programming\untitled1\venv\Scripts\python.exe D:/programming/untitled1/forum.py ['c', 'd', 1, 1, False, 0, 0]
Отредактировано xam1816 (Май 14, 2020 12:59:48)
Офлайн
1
xam1816Это потому что я вывод писал в блоке цитирования, а там квадратные скобки не работают. Это я запутал, но условие я верно написал.
у тебя в функции круглые скобки
xam1816Не правильно выводит. Должно быть:
вот что выводит
['c', 'd', 1, False,1, 0, 0]
RodegastСпасибо, попробую.
> Попробуй использовать проверку типов в условии:
Офлайн
1
Rodegast, спасибо! Добавил сравнение по типу, заработало.
Однако, остался вопрос:
a = [9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9] b = [9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9] c1 = [] for i in a: if i is not 0 and i is not 0.0: c1.append(i) print(c1) def cut_zeros(a): c2 = [] for i in a: if i is not 0 and i is not 0.0: c2.append(i) return c2 print(cut_zeros(b))
[9, 9, 1, 2, 1, 1, 3, 1, 9, 9] [9, 0.0, 9, 1, 2, 1, 1, 0.0, 3, 1, 9, 9]
a = [200, 500, 0, 0.0] a[0] == 200 True a[0] is 200 True a[1] == 500 True a[1] is 500 False a[2] is 0 True a[3] is 0.0 False
Офлайн
124
Roiser
Не правильно выводит. Должно быть:
['c', 'd', 1, False,1, 0, 0]
def move_zero(list): c =[] n=[] for i in list: if type(i)==type(False): c.append(i) if i!= 0 and type(i)!=type(False) : c.append(i) elif type(i)!=type(False): n.append(i) return c + n print (move_zero([0.0,"c","d",0,1,False,0,1])) a = [9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9] b = [9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9] print(move_zero(a)) print(move_zero(b))
Отредактировано xam1816 (Май 14, 2020 21:21:55)
Офлайн