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

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

17.07.2021, 15:14. Показов 6398. Ответов 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
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
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
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
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
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru