【问题标题】:Split each list of lists into sublists of given lengths将每个列表列表拆分为给定长度的子列表
【发布时间】:2020-05-06 13:36:16
【问题描述】:

我想将每个列表列表拆分为给定长度的子列表。 我有一个 courses 数组,它看起来像这样:

[['CS105', 'ENG101', 'MATH101', 'GER', 'ENG102', 'CS230', 'MATH120', 'GER', 'CS205', 'FREE', 'GER', 'CS106', 'CS215', 'CS107', 'ENG204', 'GER', 'MATH220', 'CS300', 'CS206', 'CS306', 'GER', 'FREE', 'CS312', 'CS450', 'GER', 'CS321', 'FREE', 'CS325', 'GER', 'CS322', 'MAJOR', 'CS310', 'STAT205', '', 'CS443', 'CS412', 'CS421', 'GER', 'CS444', 'FREE', 'FREE','','',''], ['CS105', 'ENG101', 'MATH101', 'GER', 'ENG102', 'CS230', 'MATH120', 'GER', 'CS205', 'FREE', 'GER', 'CS106', 'CS215', 'CS107', 'ENG204', 'GER', 'MATH220', 'CS300', 'CS206', 'CS306', 'GER', 'FREE', 'CS312', 'CS450', 'GER', 'CS321', 'FREE', 'CS325', 'GER', 'CS322', 'MAJOR', 'CS310', 'STAT205', '', 'CS443', 'CS412', 'CS421', 'GER', 'CS444', 'FREE', 'FREE','','',''],...]

我想将每个列表拆分为子列表,它们看起来像这样:

[[['CS105', 'ENG101', 'MATH101', 'GER'],['ENG102', 'CS230', 'MATH120', 'GER'], ['CS205', 'FREE'], ['GER'], ['CS106', 'CS215', 'CS107','ENG204', 'GER'], ['MATH220', 'CS300', 'CS206', 'CS306'], ['GER', 'FREE'], ['CS312'], ['CS450', 'GER', 'CS321', 'FREE', 'CS325'], ['GER', 'CS322', 'MAJOR', 'CS310'], ['STAT205',''], [''], ['CS443', 'CS412', 'CS421', 'GER',''], ['CS444', 'FREE', 'FREE',''],['','']]...]

到目前为止,我所做的如下:

schedule = [4, 4, 2, 1, 5, 4, 2, 1, 5, 4, 2, 1, 5, 4, 2, 1]
        for i in courses:
             Output = [courses[x - y: x] for x, y in zip(accumulate(schedule), schedule)]
        print(Output[0])

但是使用 Output[0] 打印的是连续 4 个列表,所以据我所知,它可能需要 4 对。 schedule 是我希望拆分每个列表的给定长度。我不明白我需要如何循环才能达到我需要的结果。

【问题讨论】:

  • 您的源列表的子列表是相同的,是有意的还是您只是将同一个列表粘贴了两次?哦,列表只有 44 项,但 sum(schedule) 是 47 - 缺少 3 项吗?
  • 它们是每个学生都获得的课程,因此它们具有相同的项目,只是顺序不同。例如,如果您在第一个子列表的末尾看到 2 个空项目,而在第二个则有 3 个。但通常有 1500 个子列表。只是这两个太相似了@Błotosmętek
  • 您想要的输出与schedule 定义的元素数量不匹配 - 例如,schedule 中的第一个数字5 对应于您想要的输出中的三元素列表['CS106', 'CS215', 'CS107'] .这是一个错字还是你的程序有一些额外的逻辑?
  • 这能回答你的问题吗? How do you split a list into evenly sized chunks?
  • 这是一个错字谢谢您的注意!我现在就改! @jfaccioni

标签: python arrays list split


【解决方案1】:

这里有一个功能可以满足你的需求:

from itertools import accumulate

def divide_into_schedule(input_list, schedule):
    if schedule[0] != 0: 
        schedule.insert(0, 0) 
    indices = list(accumulate(schedule)) 
    output_list = [list() for _ in input_list] 
    for start_index, end_index in zip(indices, indices[1:]): 
        for input_sublist, output_sublist in zip(input_list, output_list): 
            output_sublist.append(input_sublist[start_index:end_index]) 
    return output_list

这里的核心思想是:

  • 通过累积schedule 列表来创建要从每个子列表中获取的索引列表;
  • 初始化一个与输入列表结构相同的输出列表;
  • 压缩索引列表和相同的索引列表并移动一个元素 (indices[1:]),以便这些值成为从每个子列表中选择的开始和结束索引;
  • 压缩input_list和output_list中的每个子列表;
  • 使用开始/结束索引,将所需的子列表从input_list“复制粘贴”到output_list。

通过传递输入列表和调度来调用它:

input_list = [['CS105', 'ENG101', 'MATH101', 'GER', 'ENG102', 'CS230', 'MATH120', 'GER', 'CS205', 'FREE', 'GER', 'CS106', 'CS215', 'CS107', 'ENG204', 'GER', 'MATH220', 'CS300', 'CS206', 'CS306', 'GER', 'FREE', 'CS312', 'CS450', 'GER', 'CS321', 'FREE', 'CS325', 'GER', 'CS322', 'MAJOR', 'CS310', 'STAT205', '', 'CS443', 'CS412', 'CS421', 'GER', 'CS444', 'FREE', 'FREE','','',''], ['CS105', 'ENG101', 'MATH101', 'GER', 'ENG102', 'CS230', 'MATH120', 'GER', 'CS205', 'FREE', 'GER', 'CS106', 'CS215', 'CS107', 'ENG204', 'GER', 'MATH220', 'CS300', 'CS206', 'CS306', 'GER', 'FREE', 'CS312', 'CS450', 'GER', 'CS321', 'FREE', 'CS325', 'GER', 'CS322', 'MAJOR', 'CS310', 'STAT205', '', 'CS443', 'CS412', 'CS421', 'GER', 'CS444', 'FREE', 'FREE','','',''],...]
schedule = [4, 4, 2, 1, 5, 4, 2, 1, 5, 4, 2, 1, 5, 4, 2, 1]
output_list = divide_into_schedule(input_list, schedule)

由于我在评论中提到的拼写错误,结果完全与您想要的输出不一样,但我相信它可以满足您的需求。

【讨论】:

  • 根据我尝试过的其他事情,这真的很好而且很快!也非常感谢您的明确解释!
【解决方案2】:

为你准备了一段工作代码:

new_list = []
for c in courses:
    _sum = 0
    _list = []
    for t in schedule:
        el = c[_sum:_sum + t]
        _sum += t
        _list.append(el)
    new_list.append(_list)

可能可以更快地完成,但这应该可以完成工作!

如果您有任何问题或无法正常工作,请给我留言!希望我能帮上忙。

【讨论】:

  • 它也很好用!我不知道该代码是否比@jfaccioni 提供的答案更好,但它们都可以工作并给出所需的结果!
【解决方案3】:

你最初使用itertools.accumulate的想法其实还不错,只是犯了一些小错误:

output = [ [sublist[x - y: x] for x, y in zip(accumulate(schedule), schedule)] for sublist in courses ]

【讨论】:

  • 我不知道我是否仍然在我的代码中做错了,但即使我用这个替换代码的特定部分,打印结果也需要太多时间,这让我停下来它从运行。谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2021-08-23
  • 2011-03-28
  • 1970-01-01
  • 2013-11-26
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多