Дан список случайных чисел, нужно отсортировать третьи элементы списка в абсолютных значениях не трогая другие

Рейтинг: 0Ответов: 3Опубликовано: 19.03.2023

Пробовал сделать через условия что при каждом третьем элементе списка он сохраняет их в буфер и при соблюдение условия(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

Ответы

▲ 1Принят

Как-то так:

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]
▲ 0

Если уж используете 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]
▲ -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)
        if buf<x[i]: #(2)
            x[i]=buf
        buf=x[i]