2014-06-14 14 views
16

Jak powtarzać każdy element listy n razy i tworzyć nową listę? Na przykład:Powtarzające się elementy listy n razy

x=[1,2,3,4] 
n=3 

x1=[1,1,1,2,2,2,3,3,3,4,4,4] 

x*n nie działa

for i in x[i] 
    x1=n*x[i] 

Tam musi być prosty i elegancki sposób. działa

+2

Jak 'pandas' zaangażowane? Co tak naprawdę próbujesz osiągnąć? Co dokładnie jest nie tak z tym, co próbowałeś? – jonrsharpe

Odpowiedz

13

W przypadku naprawdę chcesz prowadzić jak liście, a generator nie jest wystarczająca:

import itertools 
lst = range(1,5) 
list(itertools.chain.from_iterable(itertools.repeat(x, 3) for x in lst)) 

Out[8]: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
3

lista zagnieżdżona-comp tutaj:

>>> [i for i in range(10) for _ in xrange(3)] 
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9] 

Albo używać przykład:

>>> x = [1, 2, 3, 4] 
>>> n = 3 
>>> [i for i in x for _ in xrange(n)] 
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
0
import itertools 

def expand(lst, n): 
    lst = [[i]*n for i in lst] 
    lst = list(itertools.chain.from_iterable(lst)) 
    return lst 

x=[1,2,3,4] 
n=3 
x1 = expand(x,3) 

print(x1) 

otrzymujemy:

[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 

wyjaśnienie:

Robi, [3]*3 daje wynik [3,3,3], zastępując to z n otrzymujemy [3,3,3,...3] (n times) Korzystanie z listowych możemy przejść przez każdy elem listy i wykonać tę operację, w końcu musimy spłaszczyć listę, co możemy zrobić list(itertools.chain.from_iterable(lst))

+0

'itertools.chain (* x)' te dni powinny być napisane jako 'itertools.chain.from_iterable (x)' – mgilson

+0

@mgilson: Thanks! – Dair

+1

Bez problemu. Widzę to stosunkowo często. Problem z tym pierwszym polega na tym, że rozwiązuje on twoją iterowalną krotkę przez zasługę operatora rozpakowywania, który częściowo pokonuje cudowne lenistwo 'itertools'. – mgilson

10

można użyć listowych:

[item for item in x for i in range(n)] 

To działa jak:

>>> x=[1,2,3,4] 
>>> n=3 
>>> new = [item for item in x for i in range(n)] 
>>> new 
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
>>> 

To jest taka sama jak Bardziej szczegółowa zagnieżdżonego for pętli:

new = [] 
for item in x: 
    for i in range(n): 
     new.append(i) 

Lub przy , jak wymagane w tagach:

pandas.Index.repeat(np.array([1, 2, 3, 4]), 3) 

>>> import pandas, numpy as np 
>>> x = [1, 2, 3, 4] 
>>> n = 3 
>>> new = pandas.Index.repeat(np.array([1, 2, 3, 4]), 3) 
>>> new 
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) 
>>> 
+0

pandas.Index.repeat to po prostu wywołanie np.repeat –

+0

@AndyHayden, ale OP oznaczono tagiem: pandy] –

+0

Widzę to, ale 'pandas.Index.repeat' __is__ np.repeat (jako metoda ndarray), nie ma tutaj magii pandy, wydaje się niemądre nazywać pandami ze względu na to (szczególnie, gdy nie jest to indeks!). Lepiej po prostu zrobić 'np.array ([1, 2, 3, 4]). Repeat (3)'. –

39

Idealnym jest prawdopodobnie numpy.repeat:

In [16]: 

x1=[1,2,3,4] 
In [17]: 

np.repeat(x1,3) 
Out[17]: 
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) 
+1

To powinna być zaakceptowana odpowiedź! –

0

Jeśli chcesz zmodyfikować listę w miejscu, najlepszym sposobem jest iteracyjne od tyłu i przypisać wycinek z tego, co poprzednio było przedmiotem z listy tego przedmiotu, n razy.

To działa z powodu przypisania slice:

>>> ls = [1, 2, 3] 
>>> ls[0: 0+1] 
[1] 
>>> ls[0: 0+1] = [4, 5, 6] 
>>> ls 
>>> [4, 5, 6, 2, 3] 
def repeat_elements(ls, times): 
    for i in range(len(ls) - 1, -1, -1): 
     ls[i: i+1] = [ls[i]] * times 

Wykorzystanie Demo:

>>> a = [1, 2, 3] 
>>> b = a 
>>> b 
[1, 2, 3] 
>>> repeat_elements(b, 3) 
>>> b 
[1, 1, 1, 2, 2, 2, 3, 3, 3] 
>>> a 
[1, 1, 1, 2, 2, 2, 3, 3, 3] 

(Jeśli nie chcesz zmodyfikować go w miejscu, można skopiować listę i zwróć kopię, która nie zmodyfikuje oryginału.To będzie również działać dla innych sekwencji, takich jak tuple s, ale nie jest leniwy jak itertools.chain.from_iterable i itertools.repeat metoda)

def repeat_elements(ls, times): 
    ls = list(ls) # Makes a copy 
    for i in range(len(ls) - 1, -1, -1): 
     ls[i: i+1] = [ls[i]] * times 
    return ls 
1

Prostszym sposobem osiągnięcia tego celu należy pomnożyć listę x z n i sortowania listy wyników. na przykład

>>> x = [1,2,3,4] 
>>> n = 3 
>>> a = sorted(x*n) 
>>> a 
>>> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 

To będzie działać nawet jeśli lista elementy są znaki:

>>> x = ['a','b','c','d'] 
>>> n = 3 
>>> a = sorted(x*n) 
>>> a 
>>> ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'] 
Powiązane problemy