2012-09-02 17 views
18

Rep Funkcja P() replikuje każdy element wektora:R funkcja REP() Pythona (replikuje elementy listy/wektor)

> rep(c("A","B"), times=2) 
[1] "A" "B" "A" "B" 

To jak liście namnażania w Pythonie

>>> ["A","B"]*2 
['A', 'B', 'A', 'B'] 

Ale z powtórzeń (R) Działanie to jest również możliwe, aby specifiy liczbę powtórzeń dla każdego elementu wektora:

> rep(c("A","B"), times=c(2,3)) 
[1] "A" "A" "B" "B" "B" 

Czy istnieje taka funkcja availbale w Pythonie? W przeciwnym razie jak można to zdefiniować? Nawiasem mówiąc, interesuje mnie taka funkcja do duplikowania wierszy tablicy.

Odpowiedz

23

numpy Zastosowanie tablic i numpy.repeat funkcję:

import numpy as np 

x = np.array(["A", "B"]) 
print np.repeat(x, [2, 3], axis=0) 

['A' 'A' 'B' 'B' 'B'] 
9

Nie jestem pewien, czy jest wbudowany dostępny dla tego, ale można spróbować czegoś takiego:

>>> lis = ["A", "B"] 
>>> times = (2, 3) 
>>> sum(([x]*y for x,y in zip(lis, times)),[]) 
['A', 'A', 'B', 'B', 'B'] 

pamiętać, że sum() działa w kwadratowego czasu. Tak więc nie jest to zalecany sposób.

>>> from itertools import chain, izip, starmap 
>>> from operator import mul 
>>> list(chain.from_iterable(starmap(mul, izip(lis, times)))) 
['A', 'A', 'B', 'B', 'B'] 

Timing comparions:

>>> 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 
1
l = ['A','B'] 
n = [2, 4] 

Twój przykład używa strun, które są już iterables. Możesz utworzyć łańcuch wyników, który jest podobny do listy.

''.join([e * m for e, m in zip(l, n)]) 
'AABBBB' 

Aktualizacja: lista zrozumienie nie jest wymagana tutaj:

''.join(e * m for e, m in zip(l, n)) 
'AABBBB' 
+0

@AshwiniChaudhary Prawidłowe ... dla twojego rozwiązania - Ale jak już piszę, sugeruję, aby użyć ciągu zamiast listy –

+1

, ale możesz pominąć część ze zrozumieniem listy i użyć po prostu: ''' .join (e * m dla e, m in zip (l, n)) ' –

+0

@AshwiniChaudhary Cool! ... Thx ... Zaktualizuję moją odpowiedź –

4

Skoro mówisz "tablicę" i wspominając R. You może i tak chcesz użyć numpy array, a następnie użyć:

import numpy as np 
np.repeat(np.array([1,2]), [2,3]) 

EDYCJA: Ponieważ wspomniałeś, że chcesz także powtarzać wiersze, myślę, że powinieneś użyć numpy. np.repeat ma argument osi, aby to zrobić.

Inne następnie, że może:

from itertools import izip, chain, repeat 
list(chain(*(repeat(a,b) for a, b in izip([1,2], [2,3])))) 

Jak nie zrobić założenie, że masz listę lub ciąg do namnażania się. Choć przyznaję, przekazanie wszystkiego jako argumentu w łańcuchu może nie jest idealne, więc pisanie własnego iteratora może być lepsze.