Найти - Пользователи
Полная версия: Функция, сортировка и логические выражения
Начало » Python для новичков » Функция, сортировка и логические выражения
1 2
Roiser
Добрый вечер! Подскажите, что я упускаю?
Задача: написать функцию, которая получает список и переставляет все нули в нем в конец.
Например,
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 неправильное, но оно так-то одинаковое…
Romissevd
Это не то что тебе надо в данной ситуации. Подробнее можешь почитать тут
Используй !=
 if i != 0 and i != 0.0: 
или
 if i not in [0, 0.0]:
Roiser
Да, я как раз подобное прочитал перед тем, как начать писАть)) В списке, который передают функции есть элементы False (а также могут быть {}, пустой список, None), которые должны остаться на местах. Я так понял, это задача на понимание разницы между 0, 0.0 и False. Не придумал, как удалить нули и оставить False через операторы сравнения, поэтому использовал is.
Но все же, почему оно по-разному работает с одинаковым логическим выражением?
xam1816
 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)
Roiser
xam1816
Это было моим первым решением, но не работает, если в списке есть элемент False.
move_zero((“c”,“d”,0,1,False,0,1)) должна вернуть ('c', ‘d’, 1, False, 1, 0, 0).
Мне что-то подсказывает, что нельзя менять изначальный список…
Например, в твоем решении метод remove вырежет и False.
Rodegast
> То есть 0.0 тоже попадают в список без нулей.

Значения типа int кэшируются в небольшом диапазоне, по этому для значений из этого диапазона сравнение через is будет работать, но такое сравнение не будет работать для других типов. Попробуй использовать проверку типов в условии:
 if not i and type(a) in (int,float):
     .....
xam1816
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

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

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

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


Roiser
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? Когда это кэширование происходит? Если это трудно объяснить тут, подскажите, где про это почитать.
xam1816
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))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB