2014-06-14 25 views
16

Làm cách nào để lặp lại từng phần tử trong danh sách n lần và tạo danh sách mới? Ví dụ:Lặp lại các phần tử của danh sách n lần

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

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

x*n không hoạt động

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

Phải có một cách đơn giản và thông minh.

+2

như thế nào 'pandas' tham gia? Bạn đang thực sự cố gắng đạt được điều gì? Điều gì chính xác là sai với những gì bạn đã thử? – jonrsharpe

Trả lời

13

Trong trường hợp bạn thực sự muốn là kết quả dạng danh sách, và máy phát điện là không đủ:

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

Một lồng list-comp làm việc ở đây:

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

Hoặc sử dụng ví dụ của bạn:

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

Cung cấp:

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

Giải thích:

Làm, [3]*3 cho kết quả của [3,3,3], thay thế này với n chúng tôi nhận [3,3,3,...3] (n times) Sử dụng một sự hiểu biết danh sách chúng ta có thể đi qua mỗi elem danh sách và thực hiện thao tác này, cuối cùng chúng ta cần phải san bằng danh sách, mà chúng ta có thể làm bằng cách list(itertools.chain.from_iterable(lst))

+0

'itertools.chain (* x)' những ngày này nên được viết là 'itertools.chain.from_iterable (x)' – mgilson

+0

@mgilson: Cảm ơn! – Dair

+1

Không sao cả. Tôi thấy rằng một người tương đối thường xuyên. Vấn đề với trước đây là nó giải quyết iterable của bạn thành một tuple bằng khen của toán tử giải nén mà phần nào đánh bại sự lười biếng tuyệt vời của 'itertools'. – mgilson

10

Bạn có thể sử dụng danh sách hiểu:

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

này chạy như:

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

Đây là giống như một tiết hơn lồng nhau for loop:

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

Hoặc, sử dụng , như bạn yêu cầu trong thẻ của mình:

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 chỉ là một cuộc gọi đến np.repeat –

+0

@AndyHayden, nhưng OP được gắn thẻ [tag: pandas] –

+0

Tôi thấy điều đó, Nhưng 'pandas.Index.repeat' __is__ np.repeat (như một phương thức ndarray), không có ma thuật gấu trúc ở đây, nó có vẻ ngớ ngẩn để gọi gấu trúc vì lợi ích của nó (đặc biệt là khi nó không phải là một Index!). Tốt hơn là chỉ cần 'np.array ([1, 2, 3, 4]). Repeat (3)'. –

39

Các lý tưởng cách có thể là 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

Đây phải là câu trả lời được chấp nhận! –

0

Nếu bạn muốn thay đổi danh sách tại chỗ, cách tốt nhất là để lặp từ phía sau và chỉ định một lát của những gì trước đây là một mục vào danh sách của mục đó n lần.

này hoạt động vì phân lát:

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

Demo sử dụng:

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

(Nếu bạn không muốn thay đổi nó tại chỗ, bạn có thể sao chép danh sách và trả lại bản sao, bản sao này sẽ không sửa đổi bản gốc. Điều này cũng sẽ hoạt động đối với các trình tự khác, chẳng hạn như tuple s, nhưng không phải là lười như itertools.chain.from_iterableitertools.repeat phương pháp)

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

Một cách đơn giản để đạt được điều này để nhân danh x với n và sắp xếp danh sách kết quả. ví dụ.

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

này sẽ làm việc ngay cả khi yếu tố danh sách của bạn là những nhân vật:

>>> x = ['a','b','c','d'] 
>>> n = 3 
>>> a = sorted(x*n) 
>>> a 
>>> ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'] 
Các vấn đề liên quan