Проверка соответствия строк и списка

Так что мне интересно, почему это:

'alpha' in 'alphanumeric'

есть True, но

list('alpha') in list('alphanumeric')

есть False.

Почему x in s преуспевает, когда x является подстрокой s, но x in l не является, когда x является подсписком l?

Ответ 1

Когда вы используете функцию list с любым итерабельным, будет создан новый объект списка со всеми элементами из итерабельного как отдельные элементы в списке.

В вашем случае строки являются допустимыми итерами Python, поэтому

>>> list('alpha')
['a', 'l', 'p', 'h', 'a']
>>> list('alphanumeric')
['a', 'l', 'p', 'h', 'a', 'n', 'u', 'm', 'e', 'r', 'i', 'c']

Итак, вы эффективно проверяете, является ли один список подписчиком другого списка.

Только в Python Строки имеют оператор in, чтобы проверить, является ли одна строка частью другой строки. Для всех других коллекций вы можете использовать только отдельные члены. Цитирование документации,

Операторы in и not in проверяют членство в коллекции. x in s принимает значение true, если x является членом коллекции s, а false в противном случае. x not in s возвращает отрицание x in s. Тест на членство в коллекции традиционно был связан с последовательностями; объект является членом коллекции, если коллекция является последовательностью и содержит элемент, равный этому объекту. Однако для многих других типов объектов имеет смысл поддерживать тесты на членство без последовательности. В частности, словари (для ключей) и множества поддерживают тестирование членства.

Для типов списка и кортежей x in y является истинным тогда и только тогда, когда существует индекс i такой, что x == y[i] является истинным.

Для Unicode и типов строк x in y является истинным тогда и только тогда, когда x является подстрокой y. Эквивалентный тест y.find(x) != -1. Примечание. x и y не обязательно должны быть одного типа; следовательно, u'ab' в 'abc' вернет True. Пустые строки всегда считаются подстрокой любой другой строки, поэтому "" в "abc" вернет True.

Ответ 2

list определить членство, если элемент равен одному из членов списка.

str определить, находится ли строка a в строке b, если подстрока b равна a > .

Ответ 3

Для второго вопроса вы спрашиваете,

['a', 'l', 'p', 'h', 'a'] in ['a', 'l', 'p', 'h', 'a', 'n', 'u', 'm', 'e', 'r', 'i', 'c']

и во втором списке нет суб-списка.

['a', 'l', 'p', 'h', 'a'] in [['a', 'l', 'p', 'h', 'a'], ['b', 'e', 't', 'a']]

будет истинным

Ответ 4

Я предполагаю, что вы ищете тот факт, что string и list имеют разные реализации магического метода __contains__.

https://docs.python.org/2/reference/datamodel.html#object. содержит

Вот почему 'alpha' in 'alphanumeric' имеет значение True, но

list('alpha') in list('alphanumeric') - False

Ответ 5

Возможно, вам стоит попробовать issubset метод.

>>> set('alpha').issubset(set('alphanumeric'))
True

хотя set('alpha') возвращает set(['a', 'p', 'l', 'h']) и set('alphanumeric'), set(['a', 'c', 'e', 'i', 'h', 'm', 'l', 'n', 'p', 'r', 'u']).

метод set делает список, игнорирующий повторяющиеся элементы.