在较小的5x5列表中拆分列表

时间:2014-10-20 20:28:46

标签: python list python-3.x

我需要拆分一个列表:

m=[[1,2,3,4,5,6,7,8,9,0],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30],[31,32,33,34,35,36,37,38,39,40],[41,42,43,44,45,46,47,48,49,50],[51,52,53,54,55,56,57,58,59,60],[61,62,63,64,65,66,67,68,69,70],[71,72,73,74,75,76,77,78,79,80],[81,82,83,84,85,86,87,88,89,90],[91,92,93,94,95,96,97,98,99,100],

进入较小的5x5列表,如:

m1=[[1,2,3,4,5],[11,12,13,14,15],[21,22,23,24,25],[31,32,33,34,35],[41,42,43,44,45]]
m2=[[6,7,8,9,0],[16,17,18,19,20],[26,27,28,29,30],[36,37,38,39,40],[46,47,48,49,50]]

并有一个包含这些较小列表的新列表:

new_list=[m1,m2,m3,m4]

感谢

1 个答案:

答案 0 :(得分:0)

首先,如何将10个元素的列表拆分为2个5个元素的列表?

def split_list(m):
    return m[:len(m)//2], m[len(m)//2:]

现在,我们希望将其映射到m中的每个列表:

mm = [split_list(sublist) for sublist in m]

但是现在我们有一对列表,而不是一对列表。你怎么解决这个问题? zip就是答案:它将foo的Y的X变成了f的X的Y:

new_list = list(zip(*mm))

如果您不喜欢这样的事实,即这会为您提供列表元组列表而不是列表列表列表,那么只需使用list comprehension和list函数:

new_list = [list(m) for m in zip(*mm)]

如果你想改变它以将任何列表分成N / 5组5,而不是2组N / 2,那只需要改变第一个功能。通用grouper函数会执行此操作,例如itertools食谱中的函数(或者如果您愿意,请参阅this question其他选项):

def grouper(iterable, n=5):
    args = [iter(iterable)] * n
    return itertools.izip_longest(*args)

所以:

new_list = [list(mm) for mm in zip(*grouper(m, 5))]