2013-07-17 19 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