2016-08-30 2 views
2

У меня есть список списков, в которых мне нужно группировать элементы, используя пользовательский ввод (см. split переменная в коде) и создайте новый список. Я пытался, но вместо того, чтобы группировки, элементы соединяются отдельноКак сгруппировать список с индексом wise?

split = 3 # user input 
data = [[1,2], [3,4], [5,6], [7,8], [9,10], [11,12], [13,14], [15,16], [17,18]] 
z = [] ; y = [] 
for i,d in enumerate(data): 
    z.append(d) 
    if (i+1)%split==0: 
     y.append(z) 
     z = [] 
xx = (y+[z]) 
print(xx) 
[[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]], [[13, 14], [15, 16], [17, 18]], []] 
# ^____________________^ ^_______________________^ this needs to be merged 

вход:

data = [[1,2], [3,4], [5,6], [7,8], [9,10], [11,12], [13,14], [15,16], [17,18]] 

ожидается выход:

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]] 

ответ

3

Вот один из способов, используя список понимание:

>>> sp = 3 
>>> fragment = len(data)//sp 
>>> [[t for item in data[i:i+fragment] for t in item] for i in range(0, len(data), fragment)] 
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]] 

А вот intertools на основе рецепта:

>>> from itertools import islice, chain 
>>> 
>>> [list(chain.from_iterable(islice(data, i, i+fragment))) for i in range(0, len(data), fragment)] 
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]] 
2

Использование NumPy:

data = [[1,2], [3,4], [5,6], [7,8], [9,10], [11,12], [13,14], [15,16], [17,18]] 
import numpy as np 
print np.array(data).reshape((split,-1)).tolist() 

Выход:

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]] 
1

Вы можете попробовать это ->

split = 3 
data = [[1,2], [3,4], [5,6], [7,8], [9,10], [11,12], [13,14], [15,16], [17,18]] 
z=[] 
x=[] 
for i,j in enumerate(data): 
    if i!=0 and i%split==0: 
     z.append(x) 
     x=[] 
    for k in j: 
     x.append(k) 
z.append(x) 
print z 
0

вы можете просто использовать z.extend(d) вместо append

3

Вы можете сделать это в основном Python, как это:

import itertools 
flatlist = [*itertools.chain(*data)] 
groupsize = int(len(flatlist)/split) 

data2 = [flatlist[i:i+groupsize] for i in range(0, len(flatlist), groupsize)] 
print(data2) 

И выход

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]