2014-10-30 4 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

+0

Порядок не имеет значения. –

+0

Я думаю, что, возможно, на самом деле это просто исправлено ... Я вынул перерыв, и теперь он работает. Любая идея, почему это может быть? –

ответ

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)) 

Edit: В противном случае вы можете попробовать следующее, а также:

lhsNet = [x for x in lhsNet if not x in rhsNet] 
rhsNet = [x for x in rhsNet if not x in lhsNet] 

The набор() метод от верхнего примера удаляет каждый дубликат в самом списке, что, вероятно, не является тем, что вы хотите. В нижнем примере удаляются только дубликаты из другого списка без дубликатов внутри самого списка.

0

Удалите break заявление и он будет работать, как вы хотите.

+0

ОП уже знает это. проверьте комментарии. Вы должны объяснить, почему это работает. –

0

Как только данные будут сопоставлены с rhsNet, внутренний цикл сломается, он не будет перебирать все данные списка rhsNet. Итак, удалите оператор break в коде и сможете получить уникальные значения в обоих списках.