从两个列表中删除重复项

0 投票
4 回答
6580 浏览
提问于 2025-04-30 13:33

我写了一段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

break这个语句去掉,它就会按照你想要的那样运行。

0

一旦数据和rhsNet匹配,内部循环就会停止,不会继续遍历rhsNet列表中的所有数据。所以,请把代码中的“break”语句去掉,这样就能得到两个列表中的唯一值。

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

在循环的时候,不应该使用break语句。
如果你把它去掉,让你的代码变成这样:

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

那么一切都会运行得很顺利。

撰写回答