Я пытаюсь написать код, который разделяет списки в классе списков на две части, когда определенное значение является средним элементом списка, а затем создает два списка, где средний элемент становится конечным элементом в первом списке и первым элементом в второй.

В списке может быть более n средних элементов, поэтому результатом должно быть n + 1 списков.

Примере:

A = [[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19,20,21,22,23,24,25],[26,27,28,29]]

P = [4,7,13,20]
n = len(Points) # in this case n = 4

Я ищу результат, который выглядит следующим образом:

A = [[0,1,2,3,4],[4,5,6,7],[7,8,9,10,11,12,13],[13,14,15],[16,17,18,19,20],[20,21,22,23,24,25],[26,27,28,29]]

Так как n = 4, и он выдаст 5 списков, обратите внимание, что в ответе есть 6 списков, поскольку последний список не имеет значения P in и, следовательно, остается неизменным.

Я не смог ничего сделать, так как я новичок в python, и эту проблему трудно сформулировать.

Любая помощь приветствуется!

-2
mb567 24 Сен 2018 в 19:20

2 ответа

Лучший ответ

Вы можете сначала восстановить все индексы предоставленных значений, а затем соответственно разрезать.

Код

def split_at_values(lst, values):
    indices = [i for i, x in enumerate(lst) if x in values]
    for start, end in zip([0, *indices], [*indices, len(lst)]):
        yield lst[start:end+1]

Примере

values =  {4, 7, 13, 20}
lst = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

print(*split_at_values(lst, values))

Выход

[0, 1, 2, 3, 4] [4, 5, 6, 7] [7, 8, 9, 10, 11, 12, 13] [13, 14, 15]

Затем вы можете применить это итеративно к списку ввода A, чтобы получить желаемый результат. В качестве альтернативы вы можете использовать itertools.chain.from_iterable.

from itertools import chain

values = {4, 7, 13, 20}
lst_A = [[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
         [16, 17, 18, 19, 20, 21, 22, 23, 24, 25],
         [26, 27, 28, 29]]

output = list(chain.from_iterable(split_at_values(sublst, values) for sublst in lst_A))

print(output)

Выход

[[0, 1, 2, 3, 4],
 [4, 5, 6, 7],
 [7, 8, 9, 10, 11, 12, 13],
 [13, 14, 15],
 [16, 17, 18, 19, 20],
 [20, 21, 22, 23, 24, 25],
 [26, 27, 28, 29]]
0
Olivier Melançon 24 Сен 2018 в 17:11

Вы можете продолжать добавлять элементы подсписка к последнему подсписку списка вывода, и, если текущий элемент равен следующему элементу в Points, добавить новый подсписок к выводу с тем же элемент и извлеките элемент из Points:

output = []
for l in List:
    output.append([])
    for i in l:
        output[-1].append(i)
        if Points and i == Points[0]:
            output.append([i])
            Points.pop(0)

С вашим примером ввода output станет:

[[0, 1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10, 11, 12, 13], [13, 14, 15], [16, 17, 18, 19, 20], [20, 21, 22, 23, 24, 25], [26, 27, 28, 29]]
0
blhsing 24 Сен 2018 в 16:46