2015-05-11 17 views
11

所以我不知道爲什麼這樣的:字符串VS列表成員檢查

'alpha' in 'alphanumeric' 

True,但

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

False

爲什麼x in s成功時xs一子,但x in l時不x是子列表l

+2

如果打印'名單( '字母')',你會發現,它並沒有包含''alpha''的子列表。 – tdelaney

+2

@tdelaney但它確實包含子列表'['a','l','p','h','a']'。如果'in'檢查了子列表而不僅僅是成員資格,那麼list('字母數字')中的list('alpha')確實會返回'True'。 –

回答

10

當您對任何迭代使用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

運營商innot 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爲真,當且僅當xy一子。等效測試是y.find(x) != -1。請注意,xy不必是相同的類型;因此,u'ab''abc'將返回True。空字符串始終被認爲是任何其他字符串的子字符串,因此​​中的""將返回True

4

list如果一個項目等於其中一個列表成員,則確定成員資格。

str■確定字符串一個是否處於串b如果b子字符串是等於一個

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

將是真實的

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

設置方法使列表忽略重複元素。