Вложен для индекса цикла вне диапазона
У меня возникла довольно тривиальная проблема, но, поскольку я довольно плохо знаком с питоном, я некоторое время разбиваю голову своему столу. (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: