Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 04.12.2019
Сообщений: 16

Переписать числа так что бы в начале были положительные числа, а в конце отрицательные

17.07.2021, 15:14. Показов 6835. Ответов 37

Студворк — интернет-сервис помощи студентам
Есть одномерный массив, его нужно заполнить рандомными числами от -10 до 10, и в другой одномерный массив записать числа так что бы в начале были положительные числа, а в конце отрицательные
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2021, 15:14
Ответы с готовыми решениями:

Переставить числа в массивах так, чтобы в начале оказались все положительные элементы, а в конце отрицательные
Заданы три одномерных масива.Переставиты числа в массивах таким образом, чтобы в начале массивов оказались все положительные элементы, а в...

Преобразовать матрицу так, чтобы в начале каждой строки были положительные элементы, а в конце отрицательные
Рассчитал матрицу по исходной формуле. Нужно преобразовать матрицу так, чтобы в начале каждой строки должны быть собраны её неотрицательные...

как переставить числа в очереди таким образом, чтобы в начале последовательности оказались все положительные числа, а в конце отрицательные?
как переставить числа в очереди таким образом, чтобы в начале последовательности оказались все положительные числа, а в конце...

37
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
19.07.2021, 15:35
Студворк — интернет-сервис помощи студентам
Viktorrus,
Цитата Сообщение от Arsegg Посмотреть сообщение
А так да, быстрее, как минимум в 2 раза (log(n), если асимтотически). Замерял на рандомных массивах на 100к элементов.
Дабы не заниматься софизмом:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
In [1]: from random import randrange
 
In [2]: a = [randrange(-100_000, 100_000) for _ in range(100_000)]
 
In [3]: %timeit sorted(a, key=lambda x: (x < 0) + (x <= 0))
25.9 ms ± 525 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
 
In [4]: def task(arr):
   ...:     p,pn=[],[]
   ...:     for a in arr:
   ...:         if a>0:
   ...:             p.append(a)
   ...:         else:
   ...:             pn.append(a)
   ...:     p.extend(pn)
   ...:     return p
   ...:
 
In [5]: %timeit task(a)
12.7 ms ± 70.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
 
In [6]: %timeit sorted(a, key=lambda x: x < 0)
30.4 ms ± 3.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
 
In [7]: %timeit sorted(a, key=lambda x: (abs(x) != x, x==0))
53.7 ms ± 7.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
2
5534 / 2887 / 573
Регистрация: 07.11.2019
Сообщений: 4,813
19.07.2021, 15:54
Чем такое решение не устраивает? В условии нигде не говориться, что числа во втором массиве должны быть из первого массива...
Python
1
b=list(range(10,-10,-1))
3
19.07.2021, 15:59

Не по теме:

u235, +100

0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
20.07.2021, 17:06

Не по теме:

u235, Вы правы. Условие задачи не корректное (сформулировано не четко). Если бы я заметил то, что заметили Вы, я бы вообще не стал заниматься рассмотрением его решения. Обычно задания с нечеткими условиями я игнорирую, или хотя бы пытаюсь добиться от ТС, что бы он конкретизировал условие задачи. Часто правильность решения зависит от правильности заданного условия. На практике, грамотно составленное ТЗ, как правило является критерием правильного решения задачи. В серьезных, крупных компаниях, как правило существует ставка "постановщик задач". Грамотное ТЗ залог эффективного решения. К сожалению многие руководители этого не понимают.



Добавлено через 3 минуты
Arsegg, Согласен, это уже конкретный аргумент. Признаю, в данном случае интуиция меня подвела.

Добавлено через 17 минут
Arsegg, Хотя я был не внимателен. Вы использовали аргумент key, я же говорил что свои функции использовать не нужно.
Просто:
Python
1
sorted(a, reverse)
дает ответ соответствующий условию и должен быть достаточно быстрым, так как использует встроенную функцию сравнения чисел.
Так что я поторопился, Вы меня не убедили, так как не проверили предложенный мной вариант.
Но наездом испортили мне настроение, сам проверять на производительность этот вариант я не буду. В том числе потому, что сообразил, мне мой вариант больше нравится, из-за того, что он более простой.
Кому нужна скорость и сложные для понимания решения, тому прямой путь в С#.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
20.07.2021, 17:37
Цитата Сообщение от Viktorrus Посмотреть сообщение
Вы меня не убедили, так как не проверили предложенный мной вариант.
Там нечего проверять: сортировка имеет time complexity O(N * log(N)). Решение данной задачи - O(N).
P. S. Условие задачи предельно ясное - расхождений, в принципе, быть не должно. Хотя можно прикопаться к:
Цитата Сообщение от xSam Посмотреть сообщение
и в другой одномерный массив записать числа
- что Ув. u235 сделал, т. к. нет уточнения, а какие именно числа нужно записывать (с прошлого шага либо любые другие).
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
20.07.2021, 17:41
Python
1
2
3
4
5
6
7
from random import randrange
 
a = [randrange(-100_000, 100_000) for _ in range(100_000)]
b = sorted(a, reverse=True)
 
print(a)
print(b)
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
20.07.2021, 17:45
Просто оставлю это здесь:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
In [1]: from random import randrange
   ...:
   ...: a = [randrange(-100_000, 100_000) for _ in range(100_000)]
 
In [2]: %timeit sorted(a, reverse=True)
36.2 ms ± 3.47 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
 
In [3]: def task(arr):
   ...:     p,pn=[],[]
   ...:     for a in arr:
   ...:         if a>0:
   ...:             p.append(a)
   ...:         else:
   ...:             pn.append(a)
   ...:     p.extend(pn)
   ...:     return p
   ...:
 
In [4]: %timeit task(a)
12.5 ms ± 180 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
20.07.2021, 17:54
Цитата Сообщение от Arsegg Посмотреть сообщение
Там нечего проверять
Действительно проверять нечего. Так как код
Python
1
b = sorted(a, reverse=True)
явно проще, чем
Python
1
2
3
4
5
6
7
8
9
10
11
def task(arr):
    p,pn=[],[]
    for a in arr:
        if a>0:
            p.append(a)
        else:
            pn.append(a)
    p.extend(pn)
    return p
    
print(task([1,4,-7,0,12,5,-3]))
да и любой другой с использованием lambda .
Скорость, как я уже неоднократно говорил, меня мало интересует, я не имею дел с задачами, которые выполняются десятками минут.

Добавлено через 3 минуты
Arsegg, Вы не привели примера с C# и как быстро там выполнится такая задача. Раз для вас так важна скорость, то Вам туда.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
20.07.2021, 17:59

Не по теме:

Цитата Сообщение от Viktorrus Посмотреть сообщение
b = sorted(a, reverse=True)
Изюм из булок))


Цитата Сообщение от Viktorrus Посмотреть сообщение
Вы не привели примера с C# и как быстро там выполнится такая задача.
Причем тут C#?
0
20.07.2021, 18:28

Не по теме:

Цитата Сообщение от Viktorrus Посмотреть сообщение
Применение встроенной сортировки повышает производительность кода
Цитата Сообщение от Viktorrus Посмотреть сообщение
Скорость, как я уже неоднократно говорил, меня мало интересует
Противоречий нет

0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
20.07.2021, 19:07

Не по теме:

Цитата Сообщение от iSmokeJC Посмотреть сообщение
Противоречий нет
Цитата Сообщение от Viktorrus Посмотреть сообщение
что сообразил, мне мой вариант больше нравится, из-за того, что он более простой.
Извините, соображаю я медленно. Поэтому возможно возникновение противоречий. Мое мнение может меняться, я это честно признаю. Но важен конечный результат.:)
Хуже, когда кто то упорно настаивает на своем, не пытаясь вникнуть в то, что говорят оппоненты.



Добавлено через 7 минут

Не по теме:

Цитата Сообщение от Arsegg Посмотреть сообщение
Причем тут C#?
При том, что существует не только Python, но и другие языки. И если подымается вопрос о скорости, то нужно использовать язык, который дает более высокую скорость програм, а не соревноваться в быстроходности в медленном языке, который нужен для других целей.
Караул. Я опять втянулся в пустую дискуссию, Какой смысл бесконечно повторять одно и тоже, когда тебя все равно не понимают?
Удачи.:)

0
20.07.2021, 19:19

Не по теме:

Цитата Сообщение от Viktorrus
Хуже, когда кто то упорно настаивает на своем, не пытаясь вникнуть в то, что говорят оппоненты.
Самокритика - это прекрасно!

0
20.07.2021, 21:05

Не по теме:

Catstail,
Если вам не сложно, замерьте пожалуйста ваше решение на списке из 100_000 случайных чисел.
Любо у меня глюк (хотя, как я написал ниже - тоже самое на online ресурсах), либо... либо вы сами все поймете.
Я бы не хотел ни с кем вступать в дискуссию по этому поводу, но мне интересен сам факт того, что мои
замеры весьма сильно не совпадают с приведенными здесь.
Скажем решения с sorted работают порядка 40-80ms (совпадая с приведенными с поправкой на меньшую вычислительный ресурс процессора). А вот по вашему императивному циклу уже нет... :-)

Я также не смог проверить это решение в online IDE на replit.com, так как код требует слишком много ОЗУ, превышая разрешенный лимит и сервер сразу же прерывает вычисление.
На других ресурсах было тоже самое:  ** Process exited due to resource limitations **

Вариант же iSmokeJC выполняется. В среднем за секунду.

0
5534 / 2887 / 573
Регистрация: 07.11.2019
Сообщений: 4,813
20.07.2021, 21:51
Python
1
2
3
4
5
6
7
8
9
a = [randrange(-100_000, 100_000) for _ in range(100_000)]
 
arr=np.array(a)
 
%timeit task(a)
6.86 ms ± 263 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
 
%timeit arr2=np.hstack((arr[arr<0], arr[arr==0], arr[arr>0]))
1.33 ms ± 6.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
20.07.2021, 21:54
Вставлю свои 5 копеек:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from itertools import groupby
from random import randrange
 
 
def cmp(x):
    return (
        1 if x > 0 else
        0 if x == 0 else
        -1
    )
    
def process(list_):
    result = [[] for _ in range(3)]
    for key, group in groupby(list_, key=cmp):
        result[key].extend(group)
    a, b, c = result
    b.extend(a)
    b.extend(c)
    return b
 
def main():
    a = [randrange(-10, 11) for _ in range(10)]
    print(*a)
    result = process(a)
    print(*result)
    
if __name__ == "__main__":
    main()
1
20.07.2021, 22:13

Не по теме:

Catstail,
Все - отменяется :-) Прощу прощения, как говорится


В общем, глюк был в одном неаккуратно поставленном пробеле при копировании кода в блокнот юпитера.
Кто-то недавно говорил, что Python трудно заставить потечь по памяти, но это не так. Я этого добился одним пробелом :-[
в данном случае перед extend, где идет слияние списков :-)

0
20.07.2021, 22:27

Не по теме:

Arsegg, почему cmp? есть же "стандартное" математическое название такой функции sgn(x) или sign(x)

https://ru.wikipedia.org/wiki/Sgn

0
20.07.2021, 23:13

Не по теме:

Цитата Сообщение от u235 Посмотреть сообщение
есть же "стандартное" математическое название такой функции sgn(x) или sign(x)
Ты безусловно прав.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2021, 23:13

Как сделать так, что-бы массиве были не только положительные числа, но и отрицательные?
Как сделать так, что-бы массиве были не только положительные числа, но и отрицательные? //фрагмент кода в котором числа от нуля...

Переставить числа последовательности таким образом, чтобы в начале этой последовательности оказались все положительные числа, а в конце отрицательные
пусть задана последовательность чисел N1, N2, ..., Nk, состоящая из положительных и отрицательных значений. составить блок схему и...

Отсортировать массив, чтобы все положительные числа находились в начале, отрицательные - в конце
Помогите пожалуйста. Дан вещественный массив A( N ) . Отсортировать его таким образом , чтобы все положительные числа находились в...

Переписать в другой файл числа так, чтобы положительные и отрицательные числа чередовались
Пожалуйста помогите сделать задание. Не знаю, как дописать программу Компоненты файла fileA – целые отличные от нуля числа, причем...

Отсортировать массив таким образом, чтобы все положительные числа находились в начале, а отрицательные в конце
Дан вещественный массив A(N).Отсортировать его таким образом,чтобы все положительные числа находились в начале,а отрицательные в конце...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru