首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分列表中的数据

拆分列表中的数据
EN

Stack Overflow用户
提问于 2018-09-10 10:37:38
回答 2查看 52关注 0票数 0

因此,我有一个数据集,我正在尝试将数据拆分为4个列表。我编写这个函数就是为了做到这一点。

代码语言:javascript
复制
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个不一定相等的组?我需要写一些灵活的东西,因为我想让相同的代码在其他可能有或多或少数据点的数据集上工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 10:56:03

这个问题可以通过使用索引切片来简化。

如果你想创建大小大致相等的n列表,你可以这样做:

代码语言:javascript
复制
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输出列表中,并保留原始顺序,则可以这样做:

代码语言:javascript
复制
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]]

票数 2
EN

Stack Overflow用户

发布于 2018-09-10 10:51:51

这是因为您的IDList列表的长度不能被4除以,这使得newlist中的一个子列表只有3个项目,并且当您zip子列表时,当任何一个输入迭代器耗尽时,压缩停止,导致只有3个列表而不是4个列表。您可以用itertools.izip_longest替换zip (在导入itertools之后),以便输出将如预期的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52250375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档