1

我有两个这样的列表

Nodelist1=[[['B', 10], ['IN', 1000]], [['C', 15], ['OUT', 1001]], [['F', 30], ['IN', 1100]]]
Nodelist2= [[['G', 20], ['IN', 1000, 'OUT', 1111]], [['D', 25], ['INWARD', 1]]]

我想做的是像这样比较这两个列表

if len(Nodelist1[i][1])==len(Nodelist2[j][1]) 

如果条件为真,那么我想删除Nodelist1[i][0]which is ['B', 10]and fromNodelist1Nodelist2[j][1]which is ['D', 25]from Nodelist2

那我应该有

Nodelist1 as [[['C', 15], ['OUT', 1001]], [['F', 30], ['IN', 1100]]]
Nodelist2 as [[['G', 20], ['IN', 1000, 'OUT', 1111]]]

我的代码是这样的:

   if len(Nodelist1)>len(Nodelist2):
      for i in range(len(Nodelist1)):
         for j in range(len(Nodelist2)):
            if len(Nodelist1[i][1])==len(Nodelist2[j][1]):
                if Nodelist1[i][1]==Nodelist2[j][1]:
                    Nodelist1.remove(Nodelist1[i])
                    Nodelist2.remove(Nodelist2[j])  
                else:
                    Nodelist1.remove(Nodelist1[i])
                    Nodelist2.remove(Nodelist2[j])  

它给了我一个错误:

if len(Nodelist1[i][1])==len(Nodelist2[j][1]):
    IndexError: list index out of range
4

3 回答 3

5

您在循环遍历列表时从列表中删除元素。因此,当您移动到列表的末尾时,没有足够的元素。并且索引访问将引发 IndexError。

于 2013-07-17T16:08:15.927 回答
1

以您的方式从列表中删除项目是相当糟糕的主意,例如

for i in range(len(Nodelist1)):
    pass

你可以这样做:

if len(Nodelist1)>len(Nodelist2):
    # store indexes of items to remove
    list1_to_del = []
    list2_to_del = []
    for i, item1 in enumerate(Nodelist1):
        for j, item2 in enumerate(Nodelist2):
            if len(item1) == len(item2):
                list1_to_del.append(i)
                list2_to_del.append(j)
             else:
                pass # not sure of your intensions and indentation

    # filter lists
    if list1_to_del:
        Nodelist1 = [item for i, item in enumerate(Nodelist1) if i not in set(list1_to_del)]
    if list2_to_del:
        Nodelist2 = [item for i, item in enumerate(Nodelist12) if i not in set(list2_to_del)]

但解决方案有点笨拙:/

于 2013-07-17T16:18:37.957 回答
0

您可能不应该使用for i in range(len(your_list)),而您可以简单地执行for val in your_list(或枚举)。但这不是问题。

问题是您在迭代列表时删除了列表中的元素。索引被移动。例如,如果您要删除索引处的元素i,则下一个元素现在具有索引i。但是你i+=1在你的循环中做。

一种解决方案是在循环之后保留要删除的元素列表并在最后删除它们。

还:

            if Nodelist1[i][1]==Nodelist2[j][1]:
                Nodelist1.remove(Nodelist1[i])
                Nodelist2.remove(Nodelist2[j])  
            else:
                Nodelist1.remove(Nodelist1[i])
                Nodelist2.remove(Nodelist2[j])

then 和 else 案例都在做同样的事情......这没有任何意义。

于 2013-07-17T16:25:29.077 回答