2014-10-30 133 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语句,并能够在这两个列表中获取唯一值。