我需要拆分一个列表:
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]
感谢
答案 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))]