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

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

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

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

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

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

Примеры
входные данные
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, поменяв местами левую и правую часть списка, в противном случае оставить...

51
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 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
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,307
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,764
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
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,307
26.07.2018, 13:45
Цитата Сообщение от lookatthis Посмотреть сообщение
Порядок ненулевых элементов изменять нельзя, дополнительный список использовать нельзя,
я про то что в условии сказано. второй код зачетный но только элементы надо тип int с str элементами не проходит (это автору топика для понимания)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
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
 Аватар для Рыжий Лис
5973 / 3735 / 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
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru