#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'}