所以我想知道为什么:
'alpha' in 'alphanumeric'
是True
,但是
list('alpha') in list('alphanumeric')
是False
。
当x in s
是x
的子字符串时,为什么s
成功,但当x in l
是子列表<{1}}时x
不成功/ {>的l
?
答案 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,
运算符
in
和not 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 y
是x
的子字符串时,y
才为真。等效测试为{{1 }}。请注意,y.find(x) != -1
和x
不一定是同一类型;因此,y
中的u'ab'
将返回'abc'
。空字符串始终被视为任何其他字符串的子字符串,因此True
中的""
将返回"abc"
。
答案 1 :(得分:4)
list
确定成员资格。
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)
我认为您正在寻找string
和list
具有__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方法使列表忽略重复元素。