Разделите каждый список списков на подсписки заданной длины - PullRequest
0 голосов
/ 06 мая 2020

Я хочу разбить каждый список списков на подсписки заданной длины. У меня есть массив курсов , который выглядит так:

[['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-х. расписание - это заданная длина, на которую я хочу, чтобы каждый список был разделен. Я не могу понять, как мне нужно l oop наверное, чтобы добиться нужного мне результата.

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Вот функция, которая делает то, что вы хотите:

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 список;
  • инициализировать выходной список с той же структурой, что и входной список;
  • zip по списку индексов и тому же списку индексов со смещенным элементом (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)

Результат не точно такой же, как ваш желаемый результат из-за опечатки, которые я упомянул в своем комментарии, но я считаю, что он делает то, что вы хотите.

0 голосов
/ 06 мая 2020

Ваша первоначальная идея использования itertools.accumulate на самом деле была неплохой, вы просто сделали несколько небольших ошибок:

output = [ [sublist[x - y: x] for x, y in zip(accumulate(schedule), schedule)] for sublist in courses ]
0 голосов
/ 06 мая 2020

Получил для вас рабочий фрагмент кода:

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)

Возможно, это можно сделать быстрее, но это должно сработать!

Напишите мне сообщение, если у вас есть какие-либо вопросы или это не работает должным образом! Надеюсь, я смогу помочь.

...