1

在 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

我找不到任何明显的原因,为什么检查“在”有序(甚至不可变)迭代中的元素与不同类型的有序、不可变迭代的行为不同。

4

3 回答 3

3

对于列表和元组等容器类型, x in container检查是否x是容器中的项目。因此ours in theirs,Python 检查是否ours是其中的一个项目theirs并发现它是 False。

请记住,列表可以包含列表。(例如[['a','b','c'], ...]

>>> ours = ['a','b','c']    
>>> theirs = [['a','b','c'], 1, 2]    
>>> ours in theirs
True
于 2013-08-19T03:01:55.510 回答
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添加了“子字符串”的概念。 string是基本序列中的一个特例。

于 2013-08-19T05:59:25.547 回答
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'
于 2013-08-19T05:01:01.053 回答