将每个列表拆分为给定长度的子列表

2024-10-02 08:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将每个列表拆分为给定长度的子列表。 我有一个课程数组,如下所示:

[['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])

但是用输出[0]打印的是一行4个列表,所以当我得到它时,可能需要4对schedule是我希望拆分每个列表的给定长度。我无法理解我需要如何循环才能达到我需要的结果


Tags: free列表schedulegermath120math101eng101cs105
3条回答

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

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)

也许可以做得更快,但这应该做的工作

如果您有任何问题或它工作不正常,请给我写信!希望我能帮忙

这里有一个函数可以满足您的需要:

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_listoutput_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)

由于我在评论中提到的打字错误,结果与您期望的输出不完全相同,但我相信它能满足您的需求

您最初使用itertools.accumulate的想法实际上相当不错,您只是犯了一些小错误:

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

相关问题 更多 >

    热门问题