所以我有一个数据集,我正在尝试将数据分成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,不一定是相等的组?我需要编写一些灵活的东西,因为我希望同一代码可以在可能具有更多或更少数据点的其他数据集上工作。
答案 0 :(得分:2)
可以通过使用索引切片来简化此问题。
如果要创建大小大致相等的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]]
。
答案 1 :(得分:1)
这是因为IDList
不能将4
列表的长度除以newlist
,而当您zip
时,在zip
中仅留下3个子列表子列表中,当任何一个输入迭代器用尽时,压缩将停止,仅产生3个列表,而不是4个列表。您可以将itertools.izip_longest
替换为itertools
(在导入hd :: tl
之后),因此输出将与预期的一样。