我在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 :(得分: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语句,并能够在两个列表中获取唯一值。