2013-04-22 3 views
32

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

def listCompare(): 
    list1 = [1, 2, 3, 4, 5] 
    list2 = [5, 6, 7, 8, 9] 
    if list1 in list2: 
    print("Number was found") 
    else: 
    print("Number not in list") 

В этом примере я хочу if оценить, True потому что 5 находится в обоих списках. Это не работает, и я не уверен в простейшем способе сравнить два списка.

+0

Я принял два решения по этому вопросу: я изменил вопрос, чтобы уточнить, что является очевидной исходной точкой вопроса: определить, есть ли какое-либо значение в одном списке в другом списке. Я считаю, что это первоначальное намерение, учитывая верхние ответы на вопросительный адрес, и @ h1h1 выбрал ответ, который обращается к этому. h1h1 не существует уже много лет, поэтому я не мог попросить его или ее уточнить. Второе предпринятое действие состояло в том, чтобы вернуть принятый ответ в его состояние до того, как он был частично изменен для определения «определить, включены ли все элементы в один список во второй список». –

ответ

64

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

def comp(list1, list2): 
    for val in list1: 
     if val in list2: 
      return True 
    return False 

Более компактный способ вы можете сделать это состоит в использовании map и reduce:

reduce(lambda v1,v2: v1 or v2, map(lambda v: v in list2, list1)) 

Даже лучше, reduce можно заменить any:

any(map(lambda v: v in list2, list1)) 

Вы могли бы также использование:

len(set(list1).intersection(list2)) > 0 
+0

Спасибо за помощь Дэвид! – h1h1

+4

первая версия не работает (когда только одно значение находится в обоих списках, вы получаете True не только тогда, когда все значения находятся в обоих списках) – thias

+2

первый подход неверен. Он сравнивается с list1 по списку2. Сравнение с петлями должно выполняться с обеих сторон, в том числе из списка2 в список1. Например: для val в списке2: ... если val в списке1 ... и т. Д. Также вы возвращаете True, если первое значение найдено в списке2, что означает, что он не будет продолжать сравнивать все значения. Внутренний оператор if должен быть (если val не в списке2: return False), что означает, что он будет продолжаться до тех пор, пока не будут получены правильные значения от первого до последнего элемента. – gextra

14

Существуют разные способы. Если вы просто хотите проверить, если один список содержит какой-либо элемент из другого списка, вы можете сделать это ..

not set(list1).isdisjoint(list2) 

Я считаю, используя isdisjoint лучше intersection для Python 2.6 и выше.

8

Ваш оригинальный подход может работать со списком понимания:

def listCompare(): 
    list1 = [1, 2, 3, 4, 5] 
    list2 = [5, 6, 7, 8, 9] 
    if [item for item in list1 if item in list2]: 
    print("Number was found") 
    else: 
    print("Number not in list") 
9

Существует встроенная функция сравнения списков:

Ниже приведен синтаксис для имп() метод -

cmp(list1, list2) 

#!/usr/bin/python 

list1, list2 = [123, 'xyz'], [123, 'xyz'] 

print cmp(list1,list2) 

При запуске над программой он производит следующий результат -

0 

Если результат галстука, а это означает, что 0 возвращается

+0

Это не отвечает на вопрос. OP хочет знать, было ли обнаружено одно и то же значение в обоих списках. – Martin

6

Вы можете изменить списки наборов, а затем сравнить оба набора с помощью функции &. например:

list1 = [1, 2, 3, 4, 5] 
list2 = [5, 6, 7, 8, 9] 

if set(list1) & set(list2): 
    print "Number was found" 
else: 
    print "Number not in list" 

«&» оператор дает точку пересечения между двумя наборами. Если есть пересечение, будет возвращено множество с пересекающимися точками. Если нет пересекающихся точек, возвращается пустое множество.

Когда вы оцениваете пустой набор/list/dict/tuple с помощью оператора «if» в Python, возвращается логическое значение False.

1

В одном из моих проектов я написал следующий код. Он в основном сравнивает каждый отдельный элемент списка. Не стесняйтесь использовать его, если он работает для вашего требования.

def reachedGoal(a,b): 
    if(len(a)!=len(b)): 
     raise ValueError("Wrong lists provided") 

    for val1 in range(0,len(a)): 
     temp1=a[val1] 
     temp2=b[val1] 
     for val2 in range(0,len(b)): 
      if(temp1[val2]!=temp2[val2]): 
       return False 
    return True 
Смежные вопросы