С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/225: Рейтинг темы: голосов - 225, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 14.07.2018
Сообщений: 23

“Сжать” список, переместив все ненулевые элементы в левую часть списка, не меняя их порядок, а все нули - в правую часть

26.07.2018, 00:20. Показов 48073. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан список целых чисел. Требуется “сжать” его, переместив все ненулевые элементы в левую часть списка, не меняя их порядок, а все нули - в правую часть. Порядок ненулевых элементов изменять нельзя, дополнительный список использовать нельзя, задачу нужно выполнить за один проход по списку. Распечатайте полученный список.

Входные данные
Вводится список чисел. Все числа списка находятся на одной строке.

Выходные данные
Выведите ответ на задачу.

Примеры
входные данные
4 0 5 0 3 0 0 5
выходные данные
4 5 3 5 0 0 0 0
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2018, 00:20
Ответы с готовыми решениями:

Сжать массив, переместив все ненулевые элементы в левую часть списка, а все нули-в правую часть
Дан список целых чисел. Требуется “сжать” его, переместив все ненулевые элементы в левую часть списка, не меняя их порядок, а все нули - в...

Сжать список, переместив все ненулевые элементы в левую часть, не меняя их порядок
Дан список целых чисел. Требуется “сжать” его, переместив все ненулевые элементы в левую часть списка, не меняя их порядок, а все нули - в...

Если длина списка нечетна, построить список, поменяв местами левую и правую часть списка
Дан список L. Если длина списка нечетна, построить список L1, поменяв местами левую и правую часть списка, в противном случае оставить...

47
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.07.2018, 06:39
Python
1
2
3
4
5
ls = '4 0 5 0 3 0 0 5'.split(' ')
result = [i for i in ls if i != '0']
count_zero = len(ls) - len(result)
result += ['0' for _ in range(count_zero)]
print(' '.join(result))
0
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,295
26.07.2018, 12:52
Рыжий Лис, у вас два дополнительных списка
Python
1
2
3
4
5
lst = input().split()
for i in reversed(range(len(lst))):
    if lst[i] == '0':
        lst.append(lst.pop(i))
print(*lst)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
26.07.2018, 13:30
Лучший ответ Сообщение было отмечено Рыжий Лис как решение

Решение

в цикле с индексами не рекомендуется менять массив
Python
1
2
3
4
5
>>> l = [1,0,3,0,2,0,0,4]
>>> l.sort(key = lambda x: not x)
>>> l
[1, 3, 2, 4, 0, 0, 0, 0]
>>>
2
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,295
26.07.2018, 13:45
Цитата Сообщение от lookatthis Посмотреть сообщение
Порядок ненулевых элементов изменять нельзя, дополнительный список использовать нельзя,
я про то что в условии сказано. второй код зачетный но только элементы надо тип int с str элементами не проходит (это автору топика для понимания)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
26.07.2018, 14:12
с генератором
Python
1
2
3
>>> l = [1,0,3,0,2,0,0,4]
>>> [i for i in l if i] +[0]*l.count(0)
[1, 3, 2, 4, 0, 0, 0, 0]
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.07.2018, 18:12
vic5710, красиво.
0
1 / 1 / 0
Регистрация: 29.06.2020
Сообщений: 19
05.08.2020, 22:48
Добавлено через 3 минуты
Python
1
2
3
a = [int(i) for i in input().split()]
b = [str(i) for i in a if not(int(i))]
print(' '.join(str(i) for i in a if int(i)), ' '.join(b))
Ещё лучше.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.08.2020, 23:56
Цитата Сообщение от poiuytjhjhjjjjj Посмотреть сообщение
Ещё лучше
Поздравляю с провалом - твой код работает в пять раз медленнее, чем первый пример vic5710.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.08.2020, 08:16
vic5710, Списковое включение, которое некоторые называют генератором списка создает новый список. Но в условии говорится, что
Цитата Сообщение от lookatthis Посмотреть сообщение
дополнительный список использовать нельзя
Поэтому необходимо обычным циклом пробежаться по всем элементам и каждый ноль удалить и вставить в конец списка. Тем самым просто внося изменения в исходный список.

Добавлено через 32 минуты
Именно такой алгоритм реализовал Semen-Semenich. Поэтому из предложенных решений только его будет правильным, если в его коде, как он ниже упомянул, при вводе преобразовать строки с числами в числа.

Добавлено через 3 минуты
И сравнивать с нулем а не со строкой '0'.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
06.08.2020, 08:21
Viktorrus, вариант vic5710 с сортировкой не создает новый список.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.08.2020, 09:11
lookatthis, Вот код, который написал Semen-Semenich, и подправленный в соответствии с его замечанием.
Python
1
2
3
4
5
6
7
lst = list(map(int, input().split()))
for i in reversed(range(len(lst))):
    if lst[i] == 0:
        lst.append(lst.pop(i))
print(*lst)
 
#  4 5 3 5 0 0 0 0
Добавлено через 5 минут
ioprst, Вы правы, просто я принял за его решение код с "генератором", а с сортировкой не воспринял.
lookatthis, С сортировкой у vic5710, самое лучшее решение, так как самое быстрое.

Добавлено через 6 минут
Только там нужно заменить первую строку для ввода с клавиатуры, как в условии
Цитата Сообщение от lookatthis Посмотреть сообщение
Входные данные
Вводится список чисел. Все числа списка находятся на одной строке.
Для этого ее нужно заменить на
Python
1
l = list(map(int, input().split()))
Добавлено через 20 минут
lookatthis, Если в коде vic5710, заменить первую строку и преобразовать интерактивный код, который у него, в программу, то получится
Python
1
2
3
4
5
l = list(map(int, input().split()))
l.sort(key = lambda x: not x)
print(*l)
 
#  4 5 3 5 0 0 0 0
Решение vic5710, которое с сортировкой, является лучшим.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
06.08.2020, 09:16
Viktorrus,
Python
1
print(*sorted(map(int, input().split()), key=lambda x: not x))
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.08.2020, 09:29
DmFat, Я хотел в одну строчку, но формальным объединением не получилось
Python
1
print(*(list(map(int, input().split())).sort(key = lambda x: not x)))
, а разбираться уже не стал.

Добавлено через 4 минуты
Я вообще не специалист в компактных кодах. Привык писать программы в развернутом виде, для меня они более понятные.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
06.08.2020, 09:29
Viktorrus, list.sort возвращает None. =>
Python
1
TypeError: print() argument after * must be an iterable, not NoneType
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
06.08.2020, 09:30
Viktorrus,

list.sort() <- изменяет существующий
sorted() <- возвращает копию
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
06.08.2020, 09:31
DmFat, разве sorted не вернет новый объект? (противоречит заданию)
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
06.08.2020, 09:33
ioprst, а разве я где то создавал список?

Добавлено через 37 секунд
Тогда это тоже является нарушением задания:

Python
1
map(int, input().split())
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
06.08.2020, 09:33
Цитата Сообщение от DmFat Посмотреть сообщение
а разве я где то создавал список?
конечно
Цитата Сообщение от DmFat Посмотреть сообщение
input().split()
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.08.2020, 09:33
DmFat, Вы смогли загнать все в одну строку, потому что вместо метода сортировки использовали функцию сортировки. Я до этого не догадался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2020, 09:33
Помогаю со студенческими работами здесь

Задан массив, содержащий несколько нулевых элементов. Требуется "сжать" его, переместив нулевые элементы в правую часть
Здравствуйте! Помогите пожалуйста решить задачу Я по факту знаю как ее решать, но прога работает бесконечно :cry: %-) Помогите...

Перенести все числа больше нуля в правую часть массива, остальные в левую
Вот примерно что получилось. void Masiv::zamina(int nn) { for (int i=0;i&lt;nn;i++) { if (g&lt;0) { z=-1; ...

Поменять левую и правую часть списка местами
Дан список I и числа k1 и k2 (k1&lt;k2)- позиций в списке, разбивающие список на три части. Поменять левую и правую часть списка местами

Перенести все нулевые элементы в правую часть матрицы
Помогите решить задача: Все нулевые элементы размещены в правой части матрицы. c++ Добавлено через 56 минут пример, тут вывод на...

В заданом одномерном масиве все положительные элементы переместить в левую часть
Народ, кто знает как в заданом одномерном масиве все положительные элементы переместить в влевую часть массива, а все остальные после их....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru