字符串与列表成员资格检查

时间:2015-05-11 19:05:43

标签: python string list

所以我想知道为什么:

'alpha' in 'alphanumeric'

True,但是

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

False

x in sx的子字符串时,为什么s成功,但当x in l是子列表<{1}}时x不成功/ {>的l

5 个答案:

答案 0 :(得分:10)

当您对任何iterable使用list函数时,将创建一个新的列表对象,其中来自iterable的所有元素作为列表中的单个元素。

在您的情况下,字符串是有效的Python迭代,所以

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

因此,您正在有效地检查一个列表是否是另一个列表的子列表。

在Python中,只有字符串有in运算符来检查一个字符串是否是另一个字符串的一部分。对于所有其他集合,您只能使用单个成员。引用documentation

  

运算符innot in测试集合成员资格。如果x in s是集合x的成员,则s计算结果为true,否则为false。 x not in s返回x in s的否定。集合成员资格测试传统上一直与序列绑定;如果集合是序列并且包含与该对象相等的元素,则对象是集合的成员。但是,许多其他对象类型支持成员资格测试而不是序列是有意义的。特别是,词典(用于键)和集合支持成员资格测试。

     

对于列表和元组类型,当{且仅当存在x in y索引i时,x == y[i]为真。

     

对于Unicode和字符串类型,当且仅当x in yx的子字符串时,y才为真。等效测试为{{1 }}。请注意,y.find(x) != -1x不一定是同一类型;因此,y中的u'ab'将返回'abc'。空字符串始终被视为任何其他字符串的子字符串,因此True中的""将返回"abc"

答案 1 :(得分:4)

如果某个项目等于其中一个列表成员,则

list确定成员资格。

如果 b 的子字符串等于 a,则

str确定字符串 a 是否在字符串 b

答案 2 :(得分:4)

对于第二个问你是否

['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']]

会是真的

答案 3 :(得分:3)

我认为您正在寻找stringlist具有__contains__魔术方法的不同实现的事实。

https://docs.python.org/2/reference/datamodel.html#object.contains

这就是为什么'alpha' in 'alphanumeric'为True,但是

list('alpha') in list('alphanumeric')为假

答案 4 :(得分:2)

也许你应该尝试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方法使列表忽略重复元素。