в python: разница между двумя списками

У меня есть два списка

found = ['CG', 'E6', 'E1', 'E2', 'E4', 'L2', 'E7', 'E5', 'L1', 'E2BS', 'E2BS', 'E2BS', 'E2', 'E1^E4', 'E5'] expected = ['E1', 'E2', 'E4', 'E1^E4', 'E6', 'E7', 'L1', 'L2', 'CG', 'E2BS', 'E3'] 

Я хочу найти различия между обоими списками.
я сделал

 list(set(expected)-set(found)) 

а также

 list(set(found)-set(expected)) 

Который возвращает ['E3'] и ['E5'] соответственно.

Тем не менее, мне нужны следующие ответы:

 'E3' is missing from found. 'E5' is missing from expected. There are 2 copies of 'E5' in found. There are 3 copies of 'E2BS' in found. There are 2 copies of 'E2' in found. 

Любая помощь / предложения приветствуются!

3 Solutions collect form web for “в python: разница между двумя списками”

Класс collections.Counter преуспеет при перечислении различий между мультимножествами:

 >>> from collections import Counter >>> found = Counter(['CG', 'E6', 'E1', 'E2', 'E4', 'L2', 'E7', 'E5', 'L1', 'E2BS', 'E2BS', 'E2BS', 'E2', 'E1^E4', 'E5']) >>> expected = Counter(['E1', 'E2', 'E4', 'E1^E4', 'E6', 'E7', 'L1', 'L2', 'CG', 'E2BS', 'E3']) >>> list((found - expected).elements()) ['E2', 'E2BS', 'E2BS', 'E5', 'E5'] >>> list((expected - found).elements()) 

Вы также можете быть заинтересованы в difflib.Differ :

 >>> from difflib import Differ >>> found = ['CG', 'E6', 'E1', 'E2', 'E4', 'L2', 'E7', 'E5', 'L1', 'E2BS', 'E2BS', 'E2BS', 'E2', 'E1^E4', 'E5'] >>> expected = ['E1', 'E2', 'E4', 'E1^E4', 'E6', 'E7', 'L1', 'L2', 'CG', 'E2BS', 'E3'] >>> for d in Differ().compare(expected, found): ... print(d) + CG + E6 E1 E2 E4 + L2 + E7 + E5 + L1 + E2BS + E2BS + E2BS + E2 E1^E4 + E5 - E6 - E7 - L1 - L2 - CG - E2BS - E3 

Использовать класс set Python и класс Counter вместо использования собственного решения:

  1. symmetric_difference : находит элементы, которые находятся либо в одном наборе, либо не в обоих.
  2. intersection : находит общие элементы с двумя наборами.
  3. difference : это, по сути, то, что вы сделали, вычитая один набор из другого

Примеры кода

  •  found.difference(expected) # set(['E5']) 
  •  expected.difference(found) # set(['E3']) 
  •  found.symmetric_difference(expected) # set(['E5', 'E3']) 
  • Поиск копий объектов: этот вопрос уже упоминался. Используя этот метод, вы получаете все дубликаты и используете результирующий объект Counter , вы можете найти, сколько дубликатов. Например:

     collections.Counter(found)['E5'] # 2 

Вы уже ответили на первые два:

 print('{0} missing from found'.format(list(set(expected) - set(found))) print('{0} missing from expected'.format(list(set(found) - set(expected))) 

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

  • В Python эффективно определить, сдвинуты ли два списка друг друга
  • Эффективное сравнение всех элементов python dict
  • Что происходит, когда вы сравниваете 2 серии панд
  • Excel сравнивает два файла csv и показывает разницу
  • Сравнение двух идентичных объектов в Python (2.7) возвращает False
  • Добавить и сравнить Datetime в Python
  • Быстро найти различия между двумя большими текстовыми файлами
  • Как сравнить список списков / наборов в python?
  • Python - лучший язык программирования в мире.