Ответ 1
Используйте numpy
массивы и numpy.repeat:
import numpy as np
x = np.array(["A", "B"])
print np.repeat(x, [2, 3], axis=0)
['A' 'A' 'B' 'B' 'B']
Функция R rep() реплицирует каждый элемент вектора:
> rep(c("A","B"), times=2)
[1] "A" "B" "A" "B"
Это похоже на умножение списка в Python:
>>> ["A","B"]*2
['A', 'B', 'A', 'B']
Но с функцией rep() R также можно указать количество повторов для каждого элемента вектора:
> rep(c("A","B"), times=c(2,3))
[1] "A" "A" "B" "B" "B"
Есть ли такая функция availbale в Python? Иначе как это можно определить? Кстати, меня также интересует такая функция для дублирования строк массива.
Используйте numpy
массивы и numpy.repeat:
import numpy as np
x = np.array(["A", "B"])
print np.repeat(x, [2, 3], axis=0)
['A' 'A' 'B' 'B' 'B']
Не уверен, что для этого есть встроенный доступ, но вы можете попробовать что-то вроде этого:
>>> lis = ["A", "B"]
>>> times = (2, 3)
>>> sum(([x]*y for x,y in zip(lis, times)),[])
['A', 'A', 'B', 'B', 'B']
Обратите внимание, что sum()
выполняется в квадратичном времени. Таким образом, это не рекомендуется.
>>> from itertools import chain, izip, starmap
>>> from operator import mul
>>> list(chain.from_iterable(starmap(mul, izip(lis, times))))
['A', 'A', 'B', 'B', 'B']
Сроки сравнения:
>>> lis = ["A", "B"] * 1000
>>> times = (2, 3) * 1000
>>> %timeit list(chain.from_iterable(starmap(mul, izip(lis, times))))
1000 loops, best of 3: 713 µs per loop
>>> %timeit sum(([x]*y for x,y in zip(lis, times)),[])
100 loops, best of 3: 15.4 ms per loop
Так как вы говорите "массив" и упоминаете R. Вы можете использовать массивы numpy anyways, а затем использовать:
import numpy as np
np.repeat(np.array([1,2]), [2,3])
EDIT: Поскольку вы упоминаете, что хотите повторять строки, я думаю, вы должны использовать numpy. np.repeat
имеет аргумент оси для этого.
Другое, что, может быть:
from itertools import izip, chain, repeat
list(chain(*(repeat(a,b) for a, b in izip([1,2], [2,3]))))
Поскольку это не делает предположение, что у вас есть список или строка для умножения. Хотя я допускаю, что передача всего в качестве аргумента в цепочку может быть не идеальной, поэтому писать свой собственный итератор может быть лучше.
l = ['A','B']
n = [2, 4]
В вашем примере используются строки, которые уже являются итерабельными. Вы можете создать строку результатов, которая похожа на список.
''.join([e * m for e, m in zip(l, n)])
'AABBBB'
Обновление: здесь не требуется понимание списка:
''.join(e * m for e, m in zip(l, n))
'AABBBB'
Что вы думаете об этом пути?
Чтобы повторить значение:
>>> repetitions=[]
>>> torep=3
>>> nrep=5
>>> for i in range(nrep):
>>> i=torep
>>> repetitions.append(i)
[3, 3, 3, 3, 3]
Чтобы повторить последовательность:
>>> repetitions=[]
>>> torep=[1,2,3,4]
>>> nrep= 2
>>> for i in range(nrep):
>>> repetitions=repetitions+torep
>>> print(repetitions)
[1, 2, 3, 4, 1, 2, 3, 4]