2013-07-17 20 views
1

访问我有两个列表这样名单在Python

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]['B', 10]Nodelist1Nodelist2[j][1]['D', 25]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 
+0

你真的需要使用'range'吗? –

+0

还有什么可以用来迭代和实现结果? – user2592166

+1

我没有真正看到这里的逻辑,为什么'[['B',10],['IN',1000]]'从'Nodelist1'中被移除,为什么'[['D',25] ,['INWARD',1]]'从'Nodelist2'中移除?由于这些元素完全不同,这似乎与您的描述不符。 –

回答

5

您删除元素同时通过它循环。所以当你移动到列表的最后时,没有足够的元素。索引访问会引发IndexError。

+1

没错。此外,他/她正在跳过列表中随后移除的项目中的每个项目。 –

+0

可以做些什么来避免这种情况并实现结果? – user2592166

+3

向后迭代:'对于范围(len(Nodelist1)-1,-1,-1)'和'对于范围内的j(len(Nodelist2)-1,-1,-1)' –

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)] 

但解决办法是有些笨拙:/

+1

这也是一个坏主意,您不会收到索引错误,但会跳过元素。看看下面的代码:'x = [1,2,3];因为我在x:x.remove(i)'。在这个'x'后列出'[2]',而不是像你期望的那样空。 –

+0

我想删除其他元素,因为他们仍然有相同数量的元素 – user2592166

+0

@ F.J同意。更新后的解决方法 – twil

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]) 

在当时和其他案件做同样的事情......这是没有意义的。

+0

问题是如果我不删除它,我的下一个元素也将满足条件,即['C',15]和['F',30] – user2592166