Дан список случайных чисел, нужно отсортировать третьи элементы списка в абсолютных значениях не трогая другие
Пробовал сделать через условия что при каждом третьем элементе списка он сохраняет их в буфер и при соблюдение условия(2) он заменял этот элемент на меньший, но на деле цикл работает условие (1), но не работает условие два и он не заменяет элементы.
import numpy as np
import random
from random import randint
x=[]
for i in range(N):
z=random.randint(a,b)
x.append(z)
buf=0
for i in range(N1):
if x[i]%3==0: #(1)
buf=x[i]
if buf<x[i]: #(2)
x[i]=buf
Ответы (3 шт):
Автор решения: Владимир Клыков
→ Ссылка
import numpy as np
import random
from random import randint
x=[]
for i in range(N):
z=random.randint(a,b)
x.append(z)
buf=0
for i in range(N1):
if x[i]%3==0: #(1)
if buf<x[i]: #(2)
x[i]=buf
buf=x[i]
Автор решения: Nowhere Man
→ Ссылка
Как-то так:
import random
from random import randint
a = -50
b = 51
N = 16
# генерация входного списка
x = [random.randint(a,b) for i in range(N)]
print(x)
# копирование каждого третьего элемента в буфер
buf=[x[i] for i in range(2, N, 3)] #
print(buf)
buf.sort(key = abs) # сортировка по модулю
print(buf)
# обратная перезапись данных в исходный список
for i in range(0, len(buf)):
x[2 + 3*i] = buf[i]
print(x)
Тест
[8, -33, -36, -41, 43, -39, 31, 31, -10, 6, -29, -11, -36, 27, 20, 48]
[-36, -39, -10, -11, 20]
[-10, -11, 20, -36, -39]
[8, -33, -10, -41, 43, -11, 31, 31, 20, 6, -29, -36, -36, 27, -39, 48]
Или же в сокращённом виде при помощи срезов (спасибо @Stanislav Volodarskiy)
x = [random.randint(a,b) for i in range(N)]
print(x)
x[2::3] = sorted(x[2::3], key = abs)
print(x)
[12, -14, -37, -33, 48, 13, 49, -32, -39, 16, 25, 3, -26, 19, -21, 43]
[12, -14, 3, -33, 48, 13, 49, -32, -21, 16, 25, -37, -26, 19, -39, 43]
Автор решения: Alex Alex
→ Ссылка
Если уж используете Numpy, то не используйте циклы. Можно сделать так:
import numpy as np
a=np.random.randint(-10,10,(12))
idx=np.argsort(np.abs(a[::3]))
a[::3]=a[3*idx]
Или так, если нумерация с единицы:
import numpy as np
a=np.random.randint(-10,10,(12))
idx=np.argsort(np.abs(a[2::3]))*3+2
a[2::3]=a[idx]