如何按索引对列表进行分组?
How to group list with index wise?
我有一个列表列表,我需要在其中使用用户输入对元素进行分组(请参阅代码中的 split
变量)并创建新列表。
我已经尝试过,但不是分组,而是单独连接元素
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]]
使用 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]]
你可以试试这个 ->
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
这是使用列表理解的一种方法:
>>> 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]]
您可以只使用 z.extend(d)
而不是 append
您可以像这样在基本 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]]
我有一个列表列表,我需要在其中使用用户输入对元素进行分组(请参阅代码中的 split
变量)并创建新列表。
我已经尝试过,但不是分组,而是单独连接元素
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]]
使用 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]]
你可以试试这个 ->
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
这是使用列表理解的一种方法:
>>> 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]]
您可以只使用 z.extend(d)
而不是 append
您可以像这样在基本 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]]