Я хочу написать функцию, которая оживляет список [1,5,3,6,...]
и дает [1,1,5,5,3,3,6,6,...]
любая идея, как это сделать?
спасибо
Дублировать каждый элемент в списке - python
Ответ 1
>>> a = range(10)
>>> [val for val in a for _ in (0, 1)]
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
N.B. _
традиционно используется как имя переменной-заполнителя, где вы не хотите ничего делать с содержимым переменной. В этом случае он просто используется для генерации двух значений за каждый раз по внешнему циклу.
Чтобы превратить это из списка в генератор, замените квадратные скобки круглыми скобками.
Ответ 2
>>> a = [1, 2, 3]
>>> b = []
>>> for i in a:
b.extend([i, i])
>>> b
[1, 1, 2, 2, 3, 3]
или
>>> [a[i//2] for i in range(len(a)*2)]
[1, 1, 2, 2, 3, 3]
Ответ 3
Я использовал бы zip
и itertools.chain
.
>>> import itertools
>>> l = [1,5,3,6,16]
>>> list(itertools.chain(*zip(l,l)))
[1, 1, 5, 5, 3, 3, 6, 6, 16, 16]
Примечание. Я использовал list
для использования генератора, чтобы он был пригодным для печати. Вероятно, вам не нужен вызов list
в вашем коде...
Ответ 4
Если у вас уже есть рецепт roundrobin
, описанный в документации для itertools
- и это очень удобно - тогда вы можете просто использовать
roundrobin(my_list, my_list)
Ответ 5
Я бы использовал
import itertools
foo = [1, 5, 3, 6]
new = itertools.chain.from_iterable([item, item] for item in foo)
new
будет итератором, который лениво повторяет повторяющиеся элементы. Если вам нужен фактический список, вы можете сделать list(new)
или использовать одно из других решений.
Ответ 6
Поскольку Гвидо не любит функциональных операторов, они могут быть довольно прокляты:
>>> from operator import add
>>> a = range(10)
>>> b = reduce(add, [(x,x) for x in a])
Ответ 7
Возможно использование умножения списка. Если вам нужен каждый элемент списка, просто используйте отсортированный метод.
>>> lst = [1,2,3,4]
>>> sorted(lst*2)
[1,1,2,2,3,3,4,4]