Как получить элементы двух списков python, которые являются одинаковыми?

Возможный дубликат:
Сравнение общих элементов между 2 списками

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

[Apples, Bananas, Pears] [Kiwis, Bananas, Apples] 

Я хотел бы получить только те элементы, которые разделяют оба списка. Для этого для этого нужны некоторые встроенные функции в python.

Результат:

 [Apples, Bananas] 

Оригинальный ответ:

 [x for x in list1 if x in list2] 

В ответ на комментарий вопрос о сохранении порядка:

Понимание этого списка – это просто сокращенная версия

 intersection = [] for x in list1: if x in list2: #Note that using 'in' involves looping over list2 intersection.append(x) 

В этой расширенной версии немного легче увидеть, что происходит. Список вывода – это точно list1 с удаленными элементами в list2 . Таким образом, он сохранит порядок list1 . Например, если list1 = [1,2,3] и list2 = [3,2,5] , то вывод понимания списка будет [2,3] . Если положение списков было отменено как это

 [x for x in list2 if x in list1] 

Тогда порядок list2 будет сохранен на выходе, что даст нам [3,2] .

Кроме того, в случае возможного нежелательного побочного эффекта это означает, что этот метод будет содержать повторяющиеся элементы list1 . Например:

 >>> [x for x in [1,2,3,3,3] if x in [2,3]] [2, 3, 3, 3] 

Итак, для вашего примера это происходит:

 >>> [fruit for fruit in ["Apples", "Bananas", "Pears"] if fruit in ["Kiwis", "Bananas", "Apples"]] ['Apples', 'Bananas'] 

Но если списки перевернуты, то результат обратный:

 >>> [fruit for fruit in ["Kiwis", "Bananas", "Apples"] if fruit in ["Apples", "Bananas", "Pears"]] ['Bananas', 'Apples'] 

Итак, в целом решение наборов лучше, потому что оно более эффективно и потому, что вам не нужны дублирующие элементы. Однако, если вы хотите сохранить порядок, это путь. (Если вы хотите сохранить заказ и не иметь дубликатов, вы можете просто использовать этот метод, а затем вычеркнуть дубликаты, в зависимости от того, хотите ли вы, чтобы предыдущий дубликат или более поздняя версия остались.)

 >>> set(["Apples", "Bananas", "Pears"]).intersection(["Kiwis", "Bananas", "Apples"]) set(['Bananas', 'Apples']) >>> list(_) ['Bananas', 'Apples'] 

Это эквивалентно:

 >>>set(["Apples", "Bananas", "Pears"]) & set(["Kiwis", "Bananas", "Apples"]) set(['Bananas', 'Apples'])