列表与字符串中的“in”语句行为

时间:2013-08-19 02:58:39

标签: python substring iterable in-operator

在Python中,询问字符串中是否存在子字符串非常简单:

>>> their_string = 'abracadabra'
>>> our_string = 'cad'
>>> our_string in their_string
True

但是,检查这些相同的字符是否在列表中“

>>> ours, theirs = map(list, [our_string, their_string])
>>> ours in theirs
False
>>> ours, theirs = map(tuple, [our_string, their_string])
>>> ours in theirs
False

我无法找到任何明显的理由为什么检查有序(甚至不可变)迭代中的元素的行为与不同类型的有序,不可变的可迭代行为不同。

3 个答案:

答案 0 :(得分:3)

对于列表和元组等容器类型,x in container检查x是否为容器中的项。因此,使用ours in theirs,Python会检查ours中的theirs是否为[['a','b','c'], ...]中的项,并发现它为False。

请记住,列表可以包含列表。 (例如>>> ours = ['a','b','c'] >>> theirs = [['a','b','c'], 1, 2] >>> ours in theirs True

{{1}}

答案 1 :(得分:1)

您是否想查看'cad'是否在字符串列表中的任何字符串中?这就像是:

stringsToSearch = ['blah', 'foo', 'bar', 'abracadabra']
if any('cad' in s for s in stringsToSearch):
    # 'cad' was in at least one string in the list
else:
    # none of the strings in the list contain 'cad'

答案 2 :(得分:1)

从Python文档中,https://docs.python.org/2/library/stdtypes.html获取序列:

x in s  True if an item of s is equal to x, else False  (1)
x not in s  False if an item of s is equal to x, else True  (1)

(1) When s is a string or Unicode string object the in and not in operations act like a substring test.

对于用户定义的类,__contains__方法实现此in测试。 listtuple实现了基本概念。 string增加了'substring'的概念。 string是基本序列中的一个特例。