Общие элементы между двумя списками, не использующими наборы в Python

Я хочу подсчитать те же элементы из двух списков. Списки могут иметь повторяющиеся элементы, поэтому я не могу преобразовать их в набор и использовать & operator.

a=[2,2,1,1] b=[1,1,3,3] 

set (a) & set (b) работать
a & b не работают

Можно сделать это с учетом заданного и диктаторского?

3 Solutions collect form web for “Общие элементы между двумя списками, не использующими наборы в Python”

В Python 3.x (и Python 2.7, когда он выпущен) вы можете использовать коллекции. Для этого:

 >>> from collections import Counter >>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements()) [1, 1] 

Вот альтернатива, использующая collection.defaultdict (доступна в Python 2.5 и более поздних версиях). Он обладает приятным свойством, что порядок результата детерминирован (он по существу соответствует порядку второго списка).

 from collections import defaultdict def list_intersection(list1, list2): bag = defaultdict(int) for elt in list1: bag[elt] += 1 result = [] for elt in list2: if elt in bag: # remove elt from bag, making sure # that bag counts are kept positive if bag[elt] == 1: del bag[elt] else: bag[elt] -= 1 result.append(elt) return result 

Для обоих этих решений количество вхождений любого заданного элемента x в выходной список является минимальным числом вхождений x в двух входных списках. Из вашего вопроса неясно, является ли это поведением, которое вы хотите.

Использование наборов является наиболее эффективным, но вы всегда можете сделать r = [i for i in l1 if i in l2] .

SilentGhost, Mark Dickinson и Lo'oris правы, очень благодарны за сообщение об этой проблеме – мне нужна общая часть списков, поэтому для:

а = [1,1,1,2]

б = [1,1,3,3]

результат должен быть [1,1]

Извините за комментарий в подходящем месте – я зарегистрировался сегодня.

Я изменил ваши решения:

 def count_common(l1,l2): l2_copy=list(l2) counter=0 for i in l1: if i in l2_copy: counter+=1 l2_copy.remove(i) return counter l1=[1,1,1] l2=[1,2] print count_common(l1,l2) 

1

  • Массивное понимание в JavaScript?
  • обертывание списка структур с помощью boost.python
  • Преобразование строки в список слов?
  • Текст по умолчанию, а также список textvariable Виджет ввода Tkinter
  • Поиск максимального списка списков по сумме элементов в Python
  • Разбиение списка на N частей примерно равной длины
  • Python: разбиение списка целых чисел на основе шага между ними
  • Добавление десятизначного целого в список объединяет некоторые записи с символом "L"
  • Замена выбранных элементов в списке в Python
  • Получить уникальные кортежи из списка, Python
  • Итерация в двух разных словарях одновременно на Python
  • Python - лучший язык программирования в мире.