2014-05-01 6 views
-5

Что было бы самым быстрым в списке итераций x, чтобы проверить, не указали ли какие-либо его символы в y?Python: Как сравнить два списка

x=['cat','dog','fish'] 
y=['a','b','b'] 
+2

Каков ожидаемый выход? – thefourtheye

+0

http://stackoverflow.com/questions/1388818/how-can-i-compare-two-lists-in-python-and-return-matches – sfletche

+0

@sfletche Я не думаю, что это дубликат, то есть сравнение две строки, чтобы увидеть, являются ли они одинаковыми, это проверка **, если символ * в * строка ** –

ответ

1

Вы можете конвертировать y в набор, а затем перебрать x, чтобы увидеть, если какой-либо из y в нем, как этот

print any(any(item in word for word in x) for item in set(y)) 
# True 

any короткого замыкания сразу после обнаружения совпадения, так что это было бы очень эффективный.

Кроме того, мы можем преобразовать их оба наборы, а затем проверить, если они непересекающиеся множества, как этого

print not {char for word in x for char in word}.isdisjoint(set(y)) 
# True 

isdisjoint также короткое замыкание, если он установит, что оба множества не непересекающиеся множества ,

+0

Мне тоже нравится это! Благодаря! – alphanumeric

+0

@Sputnix Можете ли вы, пожалуйста, отредактировать вопрос, включая образец вывода, чтобы будущие читатели также получили выгоду? Как бы то ни было, вопрос не ясен. – thefourtheye

+1

+1 для короткого замыкания 'isdisjoint'. Я не знал об этом. – mgilson

0

Использование списка понимание:

>>> x=['cat','dog','fish'] 
>>> y=['a','b','b'] 
>>> [char in word for char in y for word in x] 
[True, False, False, False, False, False, False, False, False] 
>>> 

Печатается выше выход для всех символов и слов: True потому 'a' в 'cat' и False для отдыха, потому что ничего другого не существует.

Вот пример, который легче читать:

>>> x = ['cat', 'dog', 'fish'] 
>>> y = ['a', 'b', 'c'] 
>>> [(word, char, char in word) for char in y for word in x] 
[('cat', 'a', True), ('dog', 'a', False), ('fish', 'a', False), ('cat', 'b', False), ('dog', 'b', False), ('fish', 'b', False), ('cat', 'c', True), ('dog', 'c', False), ('fish', 'c', False)] 
>>> ["It is %s that %s is in %s" %(str(char in word), char, word) for char in y for word in x] 
['It is True that a is in cat', 'It is False that a is in dog', 'It is False that a is in fish', 'It is False that b is in cat', 'It is False that b is in dog', 'It is False that b is in fish', 'It is True that c is in cat', 'It is False that c is in dog', 'It is False that c is in fish'] 
>>> 

Отвечая на Ваш комментарий, да есть способ:

>>> x = ['cat', 'dog', 'fish'] 
>>> y = ['a', 'b', 'c'] 
>>> myList = [] 
>>> [myList.append(word) for word in x for char in y if char in word] 
[None, None] 
>>> myList 
['cat', 'cat'] 
>>> list(set(myList)) 
['cat'] 
>>> 

Причина, почему список постижение печатает [None, None] потому, встроенного в методе append() ничего не возвращает, следовательно None.

+0

Красивая! Благодаря! – alphanumeric

+0

Не забудьте принять ответ, который вам помог (зеленый галочка рядом с ответом, он дает вам +2 репутацию :)) –

+0

Есть ли использование ЦП 'release' против вложенного 'для слова в x: для char в y: if char в слове: myList.append (слово) 'подход? – alphanumeric

0

Почему этого недостаточно для сравнения?

>>> x=['cat','dog','fish'] 
>>> y=['a','b','b'] 
>>> x == y 
False 
>>> b = ['a','b', 'b'] 
>>> x == b 
False 
>>> y == b 
True 
Смежные вопросы