Головоломка Python: разделы списков: почему индекс выходит за пределы диапазона? - PullRequest
0 голосов
/ 10 июля 2019

Отредактировано:

Общая проблема: Используя элементы некоторого списка длиной m * n, создайте список с m подсписками, каждый из которых имеет длину n.

В моем случае m> n и 10 и 3 соответственно.


Окончательный результат должен быть списком ("lis1"), содержащим десять списков (итерации "nulis") с тремя элементами в каждом. Кроме того, мой текущий алгоритм должен оставить «lis0» пустым. Ошибка возвращается прямо на последнем шаге.


Я анализирую некоторые CSV файлы (четыре столбца - один со списком из 3 чисел, три с одним номером каждый о соответствующих списках), которые я сгенерировал с помощью модуля CSV. Я не мог понять, как сделать это более элегантно, читая документацию к модулю, и у меня возникли некоторые проблемы с последним шагом: объединение терминов в столбцах списка в списки длиной 3 элемента (остальные столбцы сделаны).

Решение / объяснение было бы идеальным, но я воспользуюсь альтернативным подходом, если он у вас есть.

Я не могу вспомнить некоторые другие, но я пытался использовать "for j in list: while (j == list[list.index(j)+1]) или (j == list[list.index(j)-1]): newlist.append(j)", но получил ошибки памяти. Решение для этого было бы приятным, хотя и не столь уместным, потому что оно работало бы только для особого случая, в который я смотрю (тот, который работает из-за неадекватности в другом сценарии, который я писал). В текущей версии я попытался «break» (рано завершает шаг, но пропущена ошибка того же типа), «continue» и «pass», но безрезультатно.


отредактировал скрипт в функцию, которая выдает ту же ошибку, не стесняйтесь приводить специальный случай (т. Е. Любое решение описанной выше проблемы с m = 10, n = 3)

def lispart(lis,length,depth):
    l0 = list(lis)
    l1 = []
    if ((len(l0)%length) != 0) or ((len(l0)%depth) != 0):
        return "Parity Error: length and/or depth do not correspond to list"
    else:
        for i in range(int(len(l0)/depth)):
            for j in range(depth):
                nulis = [l0[j] for j in range(depth)]
                l1.append(nulis)
                for k in nulis:
                    if k in l0:
                        l0.remove(l0[l0.index(k)])
print(lispart([i for i in range(30)], 10, 3))

Я думаю, что проблема в том, что осталось недостаточно элементов для завершения создания новых списков. В конечном итоге, когда вы запустите его, как я написал, последним непустым напечатанным оператором "lis0" будет список только с одним числом, а именно последний элемент исходного списка (в котором, к сожалению, было тридцать элементов). В последнем отпечатке "lis1" было 9 элементов, и следующий (последний "nulis") элемент был правильно сформулирован, но я не могу сказать, добавляется ли он, потому что возникает ошибка, прежде чем что-либо еще будет напечатано.

Traceback (most recent call last):
  File "script.py", line X, in <module>
    nulis = [lis0[j] for j in range(3)]
  File "script.py", line X, in <listcomp>
    nulis = [lis0[j] for j in range(3)]
IndexError: list index out of range

Любая помощь будет великолепна, ребята!

1 Ответ

0 голосов
/ 12 июля 2019

Разработано Дэвидом К. Ульрихом и Питером Форманом из математики обмена стека:

def lispart(lis,depth):
    lish = list(lis)
    assert(len(lish)%depth == 0)
    return [lish[j*depth:(j+1)*depth] for j in range((int(len(lish)/depth)))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...