дублировать каждого члена в списке - python - PullRequest
27 голосов
/ 15 марта 2010

Я хочу написать функцию, которая оживляет список [1,5,3,6,...] и дает [1,1,5,5,3,3,6,6,...] есть идеи как это сделать? спасибо

Ответы [ 8 ]

48 голосов
/ 15 марта 2010
>>> 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. _ традиционно используется в качестве имени переменной-заполнителя, когда вы не хотите ничего делать с содержимым переменной. В этом случае он просто используется для генерации двух значений каждый раз во внешнем цикле.

Чтобы превратить это из списка в генератор, замените квадратные скобки круглыми скобками.

14 голосов
/ 15 марта 2010
>>> 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]
8 голосов
/ 15 марта 2010

Я бы использовал 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 в вашем коде ...

8 голосов
/ 15 марта 2010

Если у вас уже есть рецепт roundrobin, описанный в документации для itertools - и это очень удобно - тогда вы можете просто использовать

roundrobin(my_list, my_list)
4 голосов
/ 27 августа 2018

numpy.repeat делает то, что вы хотите:

import numpy as np
yourList = [1,5,3,6]
n = 2
list(np.repeat(yourList, n))

результат:

[1, 1, 5, 5, 3, 3, 6, 6]

Если вы не возражаете против использования пустых массивов, вы также можете пропустить вызов list() в последней строке.

2 голосов
/ 15 марта 2010

Я бы использовал

import itertools
foo = [1, 5, 3, 6]
new = itertools.chain.from_iterable([item, item] for item in foo)

new будет итератором, который лениво перебирает дублирующиеся элементы. Если вам нужен фактический список, вы можете выполнить list(new) или использовать одно из других решений.

1 голос
/ 15 марта 2010

Насколько Гвидо не любит функциональные операторы, они могут быть чертовски удобны:

>>> from operator import add
>>> a = range(10)
>>> b = reduce(add, [(x,x) for x in a])
0 голосов
/ 27 августа 2017

Возможно использование умножения списка. Если вам нужен каждый элемент списка вместе, просто используйте отсортированный метод.

>>> lst = [1,2,3,4]
>>> sorted(lst*2)
[1,1,2,2,3,3,4,4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...