Вложен для индекса цикла вне диапазона

У меня возникла довольно тривиальная проблема, но, поскольку я довольно плохо знаком с питоном, я некоторое время разбиваю голову своему столу. (Hurts). Хотя я полагаю, что это более логичная вещь для решения... Сначала я должен сказать, что я использую Python SDK для Cinema 4D, поэтому мне пришлось немного изменить следующий код. Но вот что я пытался сделать и с чем борюсь: я пытаюсь сгруппировать некоторые выборки полигонов, которые генерируются динамически (основываясь на некоторых правилах, что не так важно). Вот как это работает математически: эти выборки основаны на островах (это означает, что есть несколько связанных многоугольников). Затем эти выборы должны быть сгруппированы и помещены в список, с которым я могу работать. У любого многоугольника есть свой собственный индекс, так что этот должен быть довольно простым, но, как я уже говорил, я довольно сильно там борюсь.

Основную проблему легко объяснить: я пытаюсь получить доступ к несуществующему индексу в первом цикле, что приводит к ошибке индекса вне диапазона. Сначала я попытался оценить действительность, но безуспешно. Для тех, кто знаком с Cinema 4D + Python, я предоставлю немного оригинального кода, если кто-то захочет этого. Пока все так плохо. Вот упрощенный и адаптированный код.

edit: забыл упомянуть, что проверка, которая вызывает ошибку, на самом деле должна проверять только дубликаты, поэтому текущий выбранный номер будет пропущен, так как он уже обработан. Это необходимо из-за вычислительных нагрузок.

Очень надеюсь, что кто-нибудь может столкнуть меня в правильном направлении, и этот код имеет смысл до сих пор.:)

def myFunc():

        sel = [0,1,5,12] # changes with every call of "myFunc", for example to [2,8,4,10,9,1], etc. - list alway differs in count of elements, can even be empty, groups are beeing built from these values
        all = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # the whole set
        groups = [] # list to store indices-lists into
        indices = [] # list to store selected indices
        count = 0 # number of groups
        tmp = [] # temporary list to copy the indices list into before resetting

        for i in range(len(all)): # loop through values
            if i not in groups[count]: # that's the problematic one; this one actually should check whether "i" is already inside of any list inside the group list, error is simply that I'm trying to check a non existent value
                for index, selected in enumerate(sel): # loop through "sel" and return actual indices. "selected" determines, if "index" is selected. boolean.
                    if not selected: continue # pretty much self-explanatory
                    indices.append(index) # push selected indices to the list
                tmp = indices[:] # clone list
                groups.append(tmp) # push the previous generated list to another list to store groups into
                indices = [] # empty/reset indices-list
                count += 1 # increment count
        print groups    # debug
myFunc()

редактировать:

После добавления второго списка, который будет заполнен extendне append это действует как счетчик, все работает как ожидалось! Список будет простым, довольно простым;)

3 ответа

Решение
groups[count]

Когда вы в первый раз вызываете это, groups это пустой список, а количество равно 0. Вы не можете получить доступ к объекту в точке 0 в группах, потому что там ничего нет!

Попробуйте сделать groups = [] в groups = [[]] (т.е. вместо пустого списка, список списков, который имеет только пустой список).

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

if i not in groups[count]:

в

if not groups or i not in groups[count]:

Вам также не нужно копировать список, если вы не собираетесь использовать его ни для чего другого. Таким образом, вы можете заменить

            tmp = indices[:] # clone list
            groups.append(tmp) # push the previous generated list to another list to store groups into
            indices = [] # empty/reset indices-list

с

            groups.append(indices) # push the previous generated list to another list to store groups into
            indices = [] # empty/reset indices-list

Вы можете даже быть в состоянии бросить count в целом (вы всегда можете использовать len(groups)). Вы также можете заменить внутренний цикл списком

def myFunc():

    sel = [0,1,5,12] # changes with every call of "myFunc", for example to [2,8,4,10,9,1], etc. - list alway differs in count of elements, can even be empty, groups are beeing built from these values
    all = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # the whole set
    groups = [] # list to store indices-lists into

    for i in range(len(all)): # loop through values
        if not groups or i not in groups[-1]: # look in the latest group
            indices = [idx for idx, selected in enumerate(sel) if selected]
            groups.append(indices) # push the previous generated list to another list to store groups into
    print groups    # debug

Исправить строку 11 из:

   if i not in groups[count]

чтобы:

   if i not in groups:
Другие вопросы по тегам