从两个列表中删除重复项
我写了一段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)
那么一切都会运行得很顺利。