Поиск совпадающих и несовпадающих элементов в списках

Я довольно новичок в Python и немного запутался в том, что вы можете и не можете делать со списками. У меня есть два списка, которые я хочу сравнить и возвращать совпадающие и несимметричные элементы в двоичном формате. List1 имеет постоянную длину, а длина List2 отличается (но всегда короче, чем List1 ).

Например:

 List1 = ['dog', 'cat', 'pig', 'donkey'] List2 = ['dog', 'cat', 'donkey'] 

Требуемый выход:

 List3 = [1, 1, 0, 1] 

Код, который у меня есть до сих пор:

 def match_nonmatch(List1, List2): List3 = [] for i in range(len(List1)): for j in range(len(List2)): if List1[i] == List2[j]: List3.append(1) else: List3.append(0) return List3 

Я могу вернуть совпадения, когда я сравниваю списки, но когда я включаю приведенный выше оператор else, возвращаю нечеткие числа, я получаю список, который намного длиннее, чем должен быть. Например, когда я использую список, сравнивающий 60 элементов, я получаю список, содержащий 3600 элементов, а не 60.

Я был бы признателен, если бы кто-нибудь мог объяснить мне проблему с моим кодом, как он сейчас стоит, и предложить, как я могу изменить код, чтобы он делал то, что я хочу.

4 Solutions collect form web for “Поиск совпадающих и несовпадающих элементов в списках”

используйте следующий код.

 listt3=[] for i in listt1: if i in listt2: listt3.append(1) else: listt3.append(0) 

Если вы предпочитаете однострочные,

listt3=[ 1 if i in listt2 else 0 for i in listt1]

Используйте list вместо list . Таким образом, вы можете сделать много приятных вещей:

 set1 = set(['dog', 'cat', 'pig', 'donkey']) set2 = set(['dog', 'cat', 'donkey']) matched = set1.intersection(set2) # set(['dog', 'cat', 'donkey']) unmatched = set1.symmetric_difference(set2) # set(['pig']) 

Я знаю, что это не совсем то, о чем вы просили, но обычно лучше использовать наборы вместо списков, когда делаете такие вещи.

Подробнее о наборах здесь: http://docs.python.org/library/stdtypes.html#set

Вот как бы я это сделал, если list2 короткий:

 list1 = ['dog', 'cat', 'pig', 'donkey'] list2 = ['dog', 'cat', 'donkey'] list3 = [int(val in list2) for val in list1] print(list3) 

Это печатает:

 [1, 1, 0, 1] 

Если list2 длинный, вы можете сначала преобразовать его в set чтобы сделать код более эффективным:

 list1 = ['dog', 'cat', 'pig', 'donkey'] set2 = set(['dog', 'cat', 'donkey']) list3 = [int(val in set2) for val in list1] print(list3) 

Причина, по которой ваш текущий код создает слишком много элементов, заключается в том, что вы вызываете append() на каждой итерации внутреннего цикла, и есть len(List1) * len(List2) такие итерации.

Вот как это можно исправить:

 def match_nonmatch(List1, List2): List3 = [] for i in range(len(List1)): for j in range(len(List2)): if List1[i] == List2[j]: List3.append(1) break # fix #1 else: # fix #2 List3.append(0) return List3 

Обратите внимание на добавленный break и тот факт, что теперь предложение else относится к внутреннему, а не к if .

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

 >>> list1 = ['dog', 'cat', 'pig', 'donkey']; list2 = ['dog', 'cat', 'donkey'] >>> [i in list2 for i in list1] [True, True, False, True] 

Кроме того, вы должны прочитать PEP8, имена CamelCase обычно используются только для классов.

  • печать количества файлов в каталоге python
  • Выполнение функций без переопределения
  • Python import gdata Google Apps Engine: курс Builder
  • ImportError: нет модуля с именем PyQt4.QtCore
  • Когда python поднимает FloatingPointError?
  • Что такое объект кода Python?
  • Как распечатать вывод оболочки мгновенно скриптом python
  • Определите, находится ли список в порядке убывания
  • Python - лучший язык программирования в мире.