所以我不知道爲什麼這樣的:字符串VS列表成員檢查
'alpha' in 'alphanumeric'
是True
,但
list('alpha') in list('alphanumeric')
是False
。
爲什麼x in s
成功時x
是s
一子,但x in l
時不x
是子列表l
?
所以我不知道爲什麼這樣的:字符串VS列表成員檢查
'alpha' in 'alphanumeric'
是True
,但
list('alpha') in list('alphanumeric')
是False
。
爲什麼x in s
成功時x
是s
一子,但x in l
時不x
是子列表l
?
當您對任何迭代使用list
函數時,將使用迭代中的所有元素作爲列表中的單個元素創建一個新的列表對象。
在你的情況下,字符串是有效的Python iterables,所以
>>> 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
是集合s
的成員,則返回x in s
,否則返回false。x not in s
返回x in s
的否定。集合成員資格測試傳統上與序列綁定;如果集合是一個序列並且包含與該對象相等的元素,則對象是集合的成員。但是,對於許多其他對象類型來說,支持成員測試而不是序列是有意義的。特別是,詞典(用於鍵)和集合支持成員資格測試。對於列表和元組類型,
x in y
爲true,當且僅當存在索引i
,使x == y[i]
爲真。對於Unicode和字符串類型,
x in y
爲真,當且僅當x
是y
一子。等效測試是y.find(x) != -1
。請注意,x
和y
不必是相同的類型;因此,u'ab'
在'abc'
將返回True
。空字符串始終被認爲是任何其他字符串的子字符串,因此中的""
將返回True
。
list
如果一個項目等於其中一個列表成員,則確定成員資格。
str
■確定字符串一個是否處於串b如果b子字符串是等於一個。
對於第二個你是問,如果
['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']]
將是真實的
也許你應該試着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'])
。
設置方法使列表忽略重複元素。
我想你正在尋找的事實,string
和list
有不同的實現__contains__
神奇的方法。
https://docs.python.org/2/reference/datamodel.html#object.contains
這就是爲什麼'alpha' in 'alphanumeric'
是真的,但
list('alpha') in list('alphanumeric')
是假
如果打印'名單( '字母')',你會發現,它並沒有包含''alpha''的子列表。 – tdelaney
@tdelaney但它確實包含子列表'['a','l','p','h','a']'。如果'in'檢查了子列表而不僅僅是成員資格,那麼list('字母數字')中的list('alpha')確實會返回'True'。 –