Уведомления

Группа в Telegram: @pythonsu

#1 Май 13, 2020 20:47:26

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

Добрый вечер! Подскажите, что я упускаю?
Задача: написать функцию, которая получает список и переставляет все нули в нем в конец.
Например,

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))
Выводит “9, 0.0, 9, 1, 2, 1, 1, 0.0, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0”. То есть 0.0 тоже попадают в список без нулей.
Но при этом, если пишу тоже самое вне функции:
 c = []
for i in a:
    if i is not 0 and i is not 0.0:
        c.append(i)
print(c)
Выводит “9, 9, 1, 2, 1, 1, 3, 1, 9, 9”
В упор не вижу в чем разница. Похоже, логическое выражение в if неправильное, но оно так-то одинаковое…

Отредактировано Roiser (Май 13, 2020 20:49:54)

Офлайн

#2 Май 13, 2020 21:04:30

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

Это не то что тебе надо в данной ситуации. Подробнее можешь почитать тут
Используй !=

 if i != 0 and i != 0.0: 
или
 if i not in [0, 0.0]:

Офлайн

#3 Май 13, 2020 21:57:22

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

Да, я как раз подобное прочитал перед тем, как начать писАть)) В списке, который передают функции есть элементы False (а также могут быть {}, пустой список, None), которые должны остаться на местах. Я так понял, это задача на понимание разницы между 0, 0.0 и False. Не придумал, как удалить нули и оставить False через операторы сравнения, поэтому использовал is.
Но все же, почему оно по-разному работает с одинаковым логическим выражением?

Отредактировано Roiser (Май 13, 2020 22:35:33)

Офлайн

#4 Май 13, 2020 23:34:42

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

 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)

Офлайн

#5 Май 13, 2020 23:57:23

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

xam1816
Это было моим первым решением, но не работает, если в списке есть элемент False.
move_zero((“c”,“d”,0,1,False,0,1)) должна вернуть ('c', ‘d’, 1, False, 1, 0, 0).
Мне что-то подсказывает, что нельзя менять изначальный список…
Например, в твоем решении метод remove вырежет и False.

Отредактировано Roiser (Май 14, 2020 00:16:38)

Офлайн

#6 Май 14, 2020 12:09:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

> То есть 0.0 тоже попадают в список без нулей.

Значения типа int кэшируются в небольшом диапазоне, по этому для значений из этого диапазона сравнение через is будет работать, но такое сравнение не будет работать для других типов. Попробуй использовать проверку типов в условии:

 if not i and type(a) in (int,float):
     .....



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Май 14, 2020 12:12:18)

Офлайн

#7 Май 14, 2020 12:59:02

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

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]
Process finished with exit code 0

Отредактировано xam1816 (Май 14, 2020 12:59:48)

Офлайн

#8 Май 14, 2020 13:16:57

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

xam1816
у тебя в функции круглые скобки
Это потому что я вывод писал в блоке цитирования, а там квадратные скобки не работают. Это я запутал, но условие я верно написал.

xam1816
вот что выводит
Не правильно выводит. Должно быть:
 ['c', 'd', 1, False,1, 0, 0]

Rodegast
> Попробуй использовать проверку типов в условии:
Спасибо, попробую.


Офлайн

#9 Май 14, 2020 16:17:41

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

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
Почему тогда в первом цикле при i = 0.0 выражение i is not 0.0 дает False, а в функции дает True? Когда это кэширование происходит? Если это трудно объяснить тут, подскажите, где про это почитать.

Офлайн

#10 Май 14, 2020 20:52:32

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Функция, сортировка и логические выражения

Roiser
Не правильно выводит. Должно быть:
 ['c', 'd', 1, False,1, 0, 0]

заинтересовала задача,False как 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version