2015-05-11 14 views
11

Quindi mi chiedo perché questo:String vs appartenenza check list

'alpha' in 'alphanumeric' 

è True, ma

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

è False.

Perché x in s successo quando x è una stringa di s, ma x in l non lo fa quando x è un sub lista di l?

+2

Se si stampa 'lista ('alfanumerica')', si noterà che non ha un sottolista contenente ''alpha'' in esso. – tdelaney

+2

@tdelaney Ma contiene il sottolista '['a', 'l', 'p', 'h', 'a']'. Se 'in' ha verificato la presenza di sottolisti e non solo l'appartenenza, allora' lista ('alpha') nella lista ('alfanumerico') 'restituirà' True'. –

risposta

10

Quando si utilizza la funzione list con qualsiasi iterabile, verrà creato un nuovo oggetto elenco con tutti gli elementi dall'iterazione come singoli elementi nell'elenco.

Nel tuo caso, le stringhe sono iterables Python validi, quindi

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

Quindi, si sta effettivamente verificando se una lista è un elenco secondario di un altro elenco.

In Python solo Stringhe hanno l'operatore in per verificare se una stringa fa parte di un'altra stringa. Per tutte le altre raccolte, puoi utilizzare solo singoli membri. Citando il test documentation,

Gli operatori in e not in per l'adesione di raccolta. x in s restituisce true se x è un membro della raccolta s e false altrimenti. x not in s restituisce la negazione di x in s. Il test di appartenenza alla collezione è stato tradizionalmente legato a sequenze; un oggetto è un membro di una raccolta se la collezione è una sequenza e contiene un elemento uguale a quell'oggetto. Tuttavia, ha senso che molti altri tipi di oggetti supportino i test di appartenenza senza essere una sequenza. In particolare, i dizionari (per le chiavi) e gli insiemi supportano il test di appartenenza.

Per i tipi di liste e tuple, x in y è vero se e solo se esiste un indice i tale che x == y[i] è vero.

Per i tipi Unicode e stringa, x in y è vero se e solo se x è una stringa di y. Un test equivalente è y.find(x) != -1. Nota: x e non devono essere dello stesso tipo; di conseguenza, u'ab' in 'abc' restituirà True. Le stringhe vuote vengono sempre considerate come una sottostringa di qualsiasi altra stringa, pertanto "" in True restituirà True.

4

list s determinare l'appartenenza se un elemento è uguale a uno dei membri della lista.

str s determinano se stringa un è nella stringa b se una stringa di b è pari ad un .

4

Per il secondo quello che si stanno chiedendo se

['a', 'l', 'p', 'h', 'a'] in ['a', 'l', 'p', 'h', 'a', 'n', 'u', 'm', 'e', 'r', 'i', 'c']

e non v'è nessun sub-lista nel secondo elenco solo caratteri.

['a', 'l', 'p', 'h', 'a'] in [['a', 'l', 'p', 'h', 'a'], ['b', 'e', 't', 'a']]

sarebbe vero

2

forse si dovrebbe provare issubset metodo.

>>> set('alpha').issubset(set('alphanumeric')) 
True 

anche se set('alpha') rendimenti set(['a', 'p', 'l', 'h']), e set('alphanumeric'), set(['a', 'c', 'e', 'i', 'h', 'm', 'l', 'n', 'p', 'r', 'u']).

Il metodo set consente di ignorare gli elementi ripetitivi.