从两个列表中删除重复项

时间:2014-10-30 06:26:28

标签: python list duplicates

我在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'。任何人都可以向我解释我的代码中出现了什么问题以及如何修复它?

4 个答案:

答案 0 :(得分:4)

我认为这应该适合你:

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]

上面示例中的 set()方法删除了列表本身中的每个副本,这可能不是您想要的。下面的示例仅删除了另一个列表中的重复项,而没有列表中的重复项。

答案 1 :(得分:0)

迭代时你不应该使用break语句 如果您只是删除它并使您的代码看起来像。

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

一切都会完美运作

答案 2 :(得分:0)

删除break语句,它将按您的意愿运行。

答案 3 :(得分:0)

一旦数据与rhsNet匹配,内部循环将中断,它将不会遍历rhsNet列表的整个数据。因此,请删除代码中的break语句,并能够在两个列表中获取唯一值。