2014-10-30 126 views
0

我已經在python中編寫了一些代碼以從列表中刪除重複的項目。我有兩個單獨的列表,看起來像:從兩個列表中刪除重複項

lhsNet = ['p', 'p', 'p', 'p', '(2)H', 'p', '(2)H', 'p', '(3)He', '(3)He'] 

rhsNet = ['(2)H', 'e+', 'nu_e', '(2)H', 'e+', 'nu_e', '(3)He', 'gamma', '(3)He', 'gamma', '(4)He', 'p', 'p'] 

下面是代碼:

for x in lhsNet: 
    for z in rhsNet: 
     if x == z: 
      lhsNet.remove(x) 
      rhsNet.remove(z) 
      break 

的代碼應該發現,存在於兩個列表中重複條目並刪除它。對於執行後,由於某種原因,我留下:

lhsNet = ['p', 'p', 'p', 'p', '(3)He'] 

rhsNet = ['e+', 'nu_e', 'e+', 'nu_e', 'gamma', '(3)He', 'gamma', '(4)He'] 

顯然已經刪除了所有存在於兩個列表中除了最後'(3)He'重複的條目。任何人都可以向我解釋我的代碼中出了什麼問題,以及如何解決它?

+0

命令重要嗎? – IanAuld 2014-10-30 06:31:41

+0

訂單並不重要。 – 2014-10-30 06:32:01

+0

我想我可能實際上只是修好了它......我拿出了休息時間,現在它似乎工作..任何想法,爲什麼這可能是? – 2014-10-30 06:32:47

回答

0

當您迭代時,您不應該使用break語句 如果您只是將其刪除並使您的代碼看起來像。

for x in lhsNet: 
     for z in rhsNet: 
      if x == z: 
       lhsNet.remove(x) 
       rhsNet.remove(z) 

一切都會正常使用

3

我認爲應該制定出適合你:

new_lhsNet = list(set(lhsNet) - set(rhs_net)) 
new_rhsNet = list(set(rhsNet) - set(lhsNet)) 

編輯: 否則,你可以試試下面還有:

lhsNet = [x for x in lhsNet if not x in rhsNet] 
rhsNet = [x for x in rhsNet if not x in lhsNet] 

集()方法從上面的示例刪除列表中的每個副本,這可能不是您想要的。下面的例子只從另一個列表中刪除重複項,而沒有列表中的重複項。

0

取出break聲明,也將努力爲你想要的。

+0

OP已經知道它。檢查評論。你應該解釋爲什麼這會起作用。 – 2014-10-30 06:37:59

0

一旦數據與rhsNet匹配,內部循環將會中斷,它不會遍歷rhsNet列表的整個數據。因此,請刪除代碼中的break語句,並能夠在這兩個列表中獲取唯一值。