Вы можете просто использовать следующее понимание списка. Обратите внимание, что мой initial_list
отличается от того, что в OP, чтобы продемонстрировать, что порядок сохраняется.
Код:
>>> initial_list = [[1, 3, 2], [4, 5, 6], [7, 8, 9]]
>>> [[x for x in sl for _ in range(3)] for sl in initial_list]
[[1, 1, 1, 3, 3, 3, 2, 2, 2],
[4, 4, 4, 5, 5, 5, 6, 6, 6],
[7, 7, 7, 8, 8, 8, 9, 9, 9]]
Или добавьте ключ к отсортированной функции в вашем примере:
>>> [sorted(x*3, key=x.index) for x in initial_list]
[[1, 1, 1, 3, 3, 3, 2, 2, 2],
[4, 4, 4, 5, 5, 5, 6, 6, 6],
[7, 7, 7, 8, 8, 8, 9, 9, 9]]
Сравнение времени методов с различным размером списка n * n:
Генерируется с использованием perfplot - код для воспроизведения:
from itertools import chain
from functools import reduce
import perfplot
from copy import deepcopy
import numpy as np
import random
def shuffle(x):
random.shuffle(x)
return x
def cdjb(initial_list):
return [[x for x in sl for _ in range(3)] for sl in initial_list]
def aurora_sorted(initial_list):
return [sorted(x*3, key=x.index) for x in initial_list]
def aurora_list_comp(initial_list):
return [[element for element_list in inner_list for element in element_list] for inner_list in [[[element]*3 for element in inner_list] for inner_list in initial_list]]
def kederrac(initial_list):
new_list = deepcopy(initial_list)
for l in new_list:
for j in range(0, 3*len(l), 3):
l[j: j + 1] = [l[j]] * 3
return new_list
def alain_chain(initial_list):
return [list(chain(*(i3 for i3 in zip(*[sl]*3)))) for sl in initial_list]
def alain_reduce(initial_list):
return [list(reduce(lambda a,e:a+[e]*3,sl,[]))for sl in initial_list]
def alain_zip(initial_list):
return [[i for i3 in zip(*[sl]*3) for i in i3] for sl in initial_list]
def binyamin_numpy(initial_list):
return np.array(initial_list).repeat(3).reshape(len(initial_list), -1).tolist()
perfplot.show(
setup=lambda n: [shuffle([i for i in range(n)]) for j in range(n)],
n_range=[2**k for k in range(12)],
kernels=[
cdjb,aurora_sorted, aurora_list_comp, kederrac, alain_chain, alain_reduce, alain_zip, binyamin_numpy
],
xlabel='len(x)',
)