Python 嵌套for循环索引超出范围

Python 嵌套for循环索引超出范围,python,list,for-loop,indexoutofboundsexception,cinema-4d,Python,List,For Loop,Indexoutofboundsexception,Cinema 4d,我提出了一个相当琐碎的问题,但由于我对python非常陌生,所以我会在一段时间内把头撞到桌子上。(疼)。虽然我相信这是一个更符合逻辑的问题来解决。。。 首先,我必须说,我正在使用用于Cinema4D的Python SDK,因此我必须稍微更改以下代码。但以下是我一直在努力做和挣扎的事情: 我正在尝试对一些多边形选择进行分组,这些选择是动态生成的(基于一些规则,没有那么重要)。 以下是它如何以数学方式工作: 这些选择基于孤岛(意味着有多个多边形连接)。 然后,这些选择必须分组并放入我可以使用的列表中

我提出了一个相当琐碎的问题,但由于我对python非常陌生,所以我会在一段时间内把头撞到桌子上。(疼)。虽然我相信这是一个更符合逻辑的问题来解决。。。 首先,我必须说,我正在使用用于Cinema4D的Python SDK,因此我必须稍微更改以下代码。但以下是我一直在努力做和挣扎的事情: 我正在尝试对一些多边形选择进行分组,这些选择是动态生成的(基于一些规则,没有那么重要)。 以下是它如何以数学方式工作: 这些选择基于孤岛(意味着有多个多边形连接)。 然后,这些选择必须分组并放入我可以使用的列表中。 任何多边形都有自己的索引,所以这一个应该很简单,但正如我之前所说,我在这里很挣扎

主要问题很容易解释:我试图在第一个循环中访问一个不存在的索引,导致索引超出范围错误。我试着先评估有效性,但没有成功。对于那些熟悉Cinema4D+Python的人,如果有人需要,我将提供一些原始代码。到目前为止,情况很糟糕。下面是经过简化和修改的代码

编辑:忘记提及导致错误的检查实际上只应检查重复项,因此将跳过当前选定的编号,因为它已被处理。这是必要的,因为计算量很大

真的希望,任何人都能把我带向正确的方向,到目前为止,这段代码是有意义的。:)

def myFunc():
sel=[0,1,5,12]#每次调用“myFunc”时都会发生变化,例如对[2,8,4,10,9,1]的调用。列表中的元素计数总是不同,甚至可以为空,组是根据这些值构建的
全部=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]#整套
groups=[]#将索引列表存储到其中的列表
索引=[]#用于存储选定索引的列表
计数=0#组数
tmp=[]#重置前将索引列表复制到的临时列表
对于范围内的i(len(all)):#循环值
如果我没有分组[计数]:#这就是问题所在;这一个实际上应该检查“i”是否已经在组列表中的任何列表中,错误只是我试图检查一个不存在的值
对于索引,在枚举(sel)中选择:#循环通过“sel”并返回实际索引。如果选择了“索引”,则由“选定”确定。布尔型。
如果未选中:继续#几乎不言自明
索引。追加(索引)#将选定的索引推送到列表中
tmp=索引[:]#克隆列表
groups.append(tmp)#将先前生成的列表推送到另一个列表中以将组存储到
索引=[]#空/重置索引列表
计数+=1#增量计数
打印组#调试
myFunc()
编辑:

添加第二个列表后,该列表将由
extend
填充,而不是充当计数器的
append
,一切都按预期进行!该列表将是一个基本列表,非常简单;)

从以下位置更正第11行:

   if i not in groups[count]
致:

第一次调用时,组是一个空列表,计数为0。您无法在组中访问站点0处的内容,因为那里没有任何内容

试着做
groups=[]
groups=[[]]
(即,不是空列表,而是只有空列表的列表)。

我不确定您为什么要将空列表添加到组中。也许这样更好

if 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

您甚至可以完全删除
计数
(您可以始终使用
len(组)
)。您还可以用列表替换内部循环

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

groups
保存列表,
i
是一个整数。这总是
真的
然后..嗨。谢谢你的回答。我已经试过了。这不会有帮助,因为它会与另一个列表(请记住,列表中的列表)进行比较。因此,我必须深入一个层次,或者我遗漏了什么?你可以做的是在开始时添加类似于abc=0的内容,然后在列表中添加内容后,使abc=1,并使循环在abc=1时工作(一旦列表不再为空)。在这个循环中,您可以使用原始代码。是的!这是最初的问题。你的解决方案不仅解决了我的问题,还为我节省了一些代码。非常感谢你,汉克!我相信这将是一个问题,因为“count”永远不会递增,因此它将始终为0。@RobertH.,这一点很好。所以最初的逻辑有点错误。我只是在重构一下啊,刚刚看到你的编辑。我以前有过这样的代码,但是当像这样附加列表时,它给了我错误的结果。(Afair,列表是引用的,不是复制的?)列表在组列表中仍然是“活动的”,所以对它的任何更改甚至会更改任何引用的值?或者python在附加列表时是否以另一种方式处理此问题?我一定会更深入地研究这个问题谢谢你的意见@罗伯斯。当你说
index=[]
时,你正在重新绑定
索引
,所以在这一点上,它与以前的值是解耦的。如果您使用的是
索引[:]=[]
,您会遇到问题,因为现在您还清除了附加到列表中的内容groups@RobertH. 当您执行
索引=[]
时,它将创建一个新列表,并将标签“索引”重新分配给新列表。如果“索引”指向以前的列表,则该列表将丢失该引用。我无法从描述中看出您试图执行的操作,但在for循环中创建的列表根本不依赖于I,因此您将反复获得相同的“内部”列表(13倍于您显示的数据)
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
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