Наименьший путь для расширения списка по n

Я хочу развернуть список

[1,2,3,4]

по n

например. для n = 2:

[1,1,2,2,3,3,4,4]

Я ищу наименьший возможный способ добиться этого без каких-либо дополнительных библиотек. Его легко сделать цикл и добавить каждый пункт n раз в новый список... но есть ли другой способ?

Ответ 1

>>> l = [1,2,3,4]
>>> [it for it in l for _ in range(2)]
[1, 1, 2, 2, 3, 3, 4, 4]

Ответ 2

itertools [docs] на помощь:

expanded = list(chain(*izip(*tee(l, n))))

Ответ 3

Я отметил это в комментариях, но это легче объяснить в ответе, чтобы я мог привести примеры кода. Обратите внимание, что это скорее сопутствующий ответ другим, а не полный в своем собственном праве. Это просто модификация для конкретного случая.

Если вам нужно сделать это с изменяемыми объектами, вы попадаете в ловушку, используя другие методы, представленные здесь:

>>> l = [1,2,3,[4]]
>>> test = [it for it in l for _ in range(2)]
>>> test
[1, 1, 2, 2, 3, 3, [4], [4]]
>>> test[6].append(5)
>>> test
[1, 1, 2, 2, 3, 3, [4, 5], [4, 5]]

Таким образом, вам нужно использовать copy.deepcopy(), если вы хотите избежать этого.

>>> import copy
>>> l = [1,2,3,[4]]
>>> test = [copy.deepcopy(it) for it in l for _ in range(2)]
>>> test
[1, 1, 2, 2, 3, 3, [4], [4]]
>>> test[6].append(5)
>>> test
[1, 1, 2, 2, 3, 3, [4, 5], [4]]

Естественно, это необходимо только для изменяемых объектов в списке, и только если вы ожидаете их изменения после создания нового списка.

Ответ 4

>>> from itertools import chain, tee
>>> x = [1, 2, 3, 4]
>>> n = 2
>>> list(chain.from_iterable(zip(*tee(x, n))))
[1, 1, 2, 2, 3, 3, 4, 4]

Ответ 5

sum([[x]*2 for x in l],[])

где l - ваш список

Ответ 6

Поскольку автор вопроса отвечает в комментарии, что "наименьшим возможным способом" он подразумевает наименьшую длину кода, я осмелюсь опубликовать следующее решение:

>>> sorted([1,2,3,4]*2)
[1, 1, 2, 2, 3, 3, 4, 4]

Длина равна 19.

Ответ 7

>>> from itertools import repeat, chain
>>> seq = [1, 2, 3, 4]
>>> list(chain.from_iterable(repeat(x, 2) for x in seq))
[1, 1, 2, 2, 3, 3, 4, 4]

Ответ 8

>>> from itertools import chain
>>> seq = [1, 2, 3, 4]
>>> list(chain.from_iterable(zip(*[seq]*2)))
[1, 1, 2, 2, 3, 3, 4, 4]
>>> list(chain.from_iterable(zip(*[seq]*6)))
[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]