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

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

26.07.2018, 00:20. Показов 49212. Ответов 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
5234 / 3479 / 1175
Регистрация: 21.03.2016
Сообщений: 8,306
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
5234 / 3479 / 1175
Регистрация: 21.03.2016
Сообщений: 8,306
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru