Подтвердить что ты не робот

R function rep() в Python (реплицирует элементы списка/вектора)

Функция 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? Иначе как это можно определить? Кстати, меня также интересует такая функция для дублирования строк массива.

4b9b3361

Ответ 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']

Ответ 2

Не уверен, что для этого есть встроенный доступ, но вы можете попробовать что-то вроде этого:

>>> 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

Ответ 3

Так как вы говорите "массив" и упоминаете 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]))))

Поскольку это не делает предположение, что у вас есть список или строка для умножения. Хотя я допускаю, что передача всего в качестве аргумента в цепочку может быть не идеальной, поэтому писать свой собственный итератор может быть лучше.

Ответ 4

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'

Ответ 5

Что вы думаете об этом пути?

Чтобы повторить значение:

>>> 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]