因此,我有一个数据集,我正在尝试将数据拆分为4个列表。我编写这个函数就是为了做到这一点。
def __spit_list_into_group(self, IDList, n, list1, list2, list3, list4):
newlist = [IDList[i:i + n] for i in xrange(0, len(IDList), n)]
list1, list2, list3, list4 = map(list, zip(*newlist))
return list1, list2, list3, list4但是,当我将n设置为4时,代码只能将数据拆分为3个列表,而当我将n设置为5时,代码将数据拆分为5个列表。为什么代码不将数据拆分为4,以及如何让代码将数据拆分为4?
编辑:我意识到这个数据集有15个数据点,这就是为什么我只能将它分成3个和5个。我如何将数据分成4个不一定相等的组?我需要写一些灵活的东西,因为我想让相同的代码在其他可能有或多或少数据点的数据集上工作。
发布于 2018-09-10 10:56:03
这个问题可以通过使用索引切片来简化。
如果你想创建大小大致相等的n列表,你可以这样做:
def split_list(input_list, n):
output_lists = [input_list[i::n] for i in range(n)]
return output_lists这以n跳跃的形式遍历您的输入列表,以提供所需数量的输出列表。
例如,假设您的输入列表是range(15)或[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],并且您想要n=4列表。这将返回[[0,4,8,12],[1,5,9,13],[2,6,10,14],[3,7,11]]。
或者,如果您希望将输入列表分组到n输出列表中,并保留原始顺序,则可以这样做:
import math
def split_list(input_list, n):
group_size = int(math.ceil(len(input_list)/float(n)))
output_lists = [input_list[group_size*i:min((i+1)*group_size, len(input_list))] for i in range(n)]
return output_lists使用与上面相同的示例,这将返回[[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14]]。
发布于 2018-09-10 10:51:51
这是因为您的IDList列表的长度不能被4除以,这使得newlist中的一个子列表只有3个项目,并且当您zip子列表时,当任何一个输入迭代器耗尽时,压缩停止,导致只有3个列表而不是4个列表。您可以用itertools.izip_longest替换zip (在导入itertools之后),以便输出将如预期的那样。
https://stackoverflow.com/questions/52250375
复制相似问题