Получение различий между двумя списками (не просто сравнение)

#python

Вопрос:

В следующем коде перечислена разница между двумя списками:

 def Diff(li1, li2):
    return list(set(li1) - set(li2))   list(set(li2) - set(li1))

ListA = ["A","B","C","D","E"];
ListB= ["A","B","X"];

diff = Diff(ListA , ListB)
print(diff )
 

Выход

 ['D', 'E', 'C', 'X']
 

но мне нужно не просто перечислить различия, мне нужно:

A) перечислите только элементы из списка A, которые не перечислены в списке B
B) перечислите только элементы из списка B, которые не перечислены в списке A

Как я могу это сделать?

Комментарии:

1.Вам нужно понять, что на самом деле делает ваша Diff функция и как именно. Тогда ваши А и В будут довольно тривиальными.

2. О, ух ты! это было очень полезно!

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

4. Можете ли вы включить ожидаемые результаты в качестве примера, похожего на ваши фактические результаты? Вам нужны 2 списка?

5. Похоже, вам нужны две разные функции для выполнения этих двух разных задач, или, может быть, одна функция, которая возвращает два разных списка,

Ответ №1:

ваш код перечисляет то, что вам нужно, но в одном списке

А) перечислите только те элементы из списка А, которые не перечислены в списке В

 InANotInB=list(set(li1) - set(li2))
 

B) перечислите только те элементы из списка B, которые не перечислены в списке A

 InBNotInA=list(set(li2) - set(li1))
 

Ответ №2:

Если ваши списки могут содержать повторяющиеся элементы, вам нужно будет использовать Counter вместо set :

 from collections import Counter
def diff(L1,L2):
    C1,C2 = Counter(L1),Counter(L2)
    return list((C1-C2).elements()), list((C2-C1).elements())
 

Выход:

 ListA = ["A","B","C","D","E"]
ListB= ["A","B","X"]

print(diff(ListA ,ListB))

(['C', 'D', 'E'], ['X'])   # (Only in listA, Only in ListB)

ListA = ["A","B","B","B","C","D","E"]
ListB= ["A","A","X","B","C","C","C"]

print(diff(ListA ,ListB))

(['B', 'B', 'D', 'E'], ['A', 'X', 'C', 'C'])
 

Если вам нужен только один список элементов, которых нет в обоих списках:

Со счетчиком для поддержки дубликатов:

 def diff(L1,L2):
    C1,C2 = Counter(L1),Counter(L2)
    return [*((C1|C2)-(C1amp;C2)).elements() ]

# ['C', 'D', 'E', 'X']
# ['A', 'B', 'B', 'C', 'C', 'D', 'E', 'X']
 

Использование наборов, если списки не содержат дубликатов:

 def diff(L1,L2):
    return set(L1).symmetric_difference(L2)

# {'D', 'X', 'E', 'C'}