2016-01-28 2 views
3

Легко проверить, если элемент списка в другой список с помощью any():найти, если какой-либо элемент в списке находится в другом списке, и вернуть первый элемент найден

any(elem in list2 for elem in list1) 

но есть в любом случае Идиоматический способ возврата первого найденного элемента?

Я предпочел бы решение однострочный, а не:

for elem in list1: 
    if elem in list2: 
     return elem 
+1

Возможный дубликат [Общее сравнение элементов между 2 списка] (http://stackoverflow.com/questions/ 2864842/common-elements-compare-between-2-lists) – M4rtini

+0

Вы хотите совпадения или первое совпадение? Ваш пример - первое совпадение. –

+1

Если вы хотите только первый, это будет дубликат этого: http: // stackoverflow.com/questions/16118621/first-common-element-from-two-lists – M4rtini

ответ

2

Этот ответ похож на an answer на a similar question, где @jamylak переходит в более подробно о синхронизации результатов по сравнению с другими алгоритмами.

Если вы просто хотите, первый элемент, который соответствует, используйте next:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [14, 17, 9, 3, 8] 
>>> next(element for element in a if element in b) 
3 

Это не слишком эффективно, как он выполняет линейный поиск b для каждого элемента. Вы можете создать set из b, который имеет более высокую производительность подстановок:

>>> b_set = set(b) 
>>> next(element for element in a if element in b_set) 

Если next не находит ничего, что вызывает исключение:

>>> a = [4, 5] 
>>> next(element for element in a if element in b_set) 
Traceback (most recent call last): 
StopIteration 

Вы можете дать ему по умолчанию, чтобы вернуться вместо этого, например, None. Однако это меняет синтаксис как параметры функции анализируются и вы должны явно создать выражение генератора:

>>> None is next((element for element in a if element in b_set), None) 
True 
+0

Возможно, вам понадобится кредит jamylak для последней части о возврате 'None', если ничего не найдено. Я предполагаю, что вы вдохновили его, так как редактирование произошло после вашего комментария о его ответе в дубликате? – M4rtini

+1

У меня возникла идея упомянуть о возможности найти элемент после прочтения [их ответа] (http://stackoverflow.com/a/16118989/1084416). Однако они не упоминают об этом сами, это неявно, и они не расширяются. Я не думаю, что я что-то скопировал из ответа. Я сам использую эту идиому ежедневно в своей работе и не узнал ее из ответа. –

+0

Хорошо, справедливо :) – M4rtini

0

Да, это возможно, с помощью фильтра, делая список вашего понимания:

list1 = ['a', 'b', 'c', 'd', 'e'] 
list2 = ['g', 'z', 'b', 'd', '33'] 
[elem for elem in list1 if elem in list2] 
# ['b', 'd'] 
3

Используйте наборы: https://docs.python.org/2/library/sets.html

result = set(list1) & set(list2) 

, если вы хотите, чтобы сделать его условным, как и любой:

if (set(list1) & set(list2)): 
    do something 
+2

add pop(), чтобы получить один элемент, как в вопросе: 'result = (set (list1) & set (list2)). Pop()' – amotzg

+0

Это, конечно же, предполагает это хотя бы один общий элемент, иначе KeyError будет повышаться. – amotzg

+0

Результатом является результат. если в обоих списках имеется больше элементов, результат будет более одного элемента. , , – Serbitar

0

Используйте список понимание:

[elem for elem in list1 if elem in list2] 

Пример:

list1 = [1, 2, 3, 4, 5] 
list2 = [1, 10, 2, 20] 

c = [elem for elem in list1 if elem in list2] 
print(c) 

Выход

[1, 2] 
0
def intersect(a, b): 
    return list(set(a) & set(b)) 

print intersect(b1, b2)