2010-08-19 17 views
5

Si tengo Lista PhoneDirectory Ej:Comparación Subcadena en Python

['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'] 

¿Cuál es la función que se puede utilizar para comparar la presencia de subcadena (Ej: Joh) en cada entrada en la lista.

He intentado usar

if(PhoneDirectory.find(Joh) != -1) 

pero no funciona

amablemente ayuda ..

+0

Su denominación es poco. Los nombres de mayúsculas de las letras mayúsculas generalmente se reservan por convención a las Clases. PhoneDirectory busca una lista de cadenas para mí, yo lo llamaría números de teléfono de acuerdo con las convenciones de nomenclatura de Python. Encuentro útil que los nombres de las variables de la lista sean plurales. –

+0

Solo para señalar, ¿no sería mejor guardarlo como diccionario? '{s.split (": ") [0]: s.split (": ") [1] para s en ...}' – katrielalex

Respuesta

15

Si desea comprobar cada entrada por separado:

for entry in PhoneDirectory: 
    if 'John' in entry: ... 

Si lo que desea es saber si cualquier entrada satisface la condición y no le importa cuál:

if any('John' in entry for entry in PhoneDirectory): 
    ... 

Tenga en cuenta que any no hará ningún trabajo "desperdiciado" - devolverá True tan pronto como encuentre uno entrada cumple la condición (si ninguna entrada cumple con la condición, tiene que verificar cada una de ellas para confirmar, por supuesto, y luego devuelve False).

+4

+1 para 'any'. Muy genial. –

+0

Como está cerca del desarrollo de Python, ¿sabe por qué alguno no devuelve el primer valor "Verdadero" (digamos "Johnny") pero solo es menos útil? Verdadero (incluso el intérprete debe saber la respuesta exacta). Es decir: ¿para trabajar como o en Python o principio de "resultado útil" en Lisp? Por cierto, debería ser: si lo hay (la entrada comienza con'John: 'en la entrada para entrar en PhoneDirectory) –

+0

@Tony, ya que 'any' tiene que devolver' False' (por ejemplo, para una lista vacía, no puede simplemente " devuelve un valor falso de la secuencia ") cuando dice" no ", por razones de simetría se juzgó mejor siempre hacer que devuelva un valor booleano.Re su BTW, quizás, pero (si es así), entonces solo después de corregir el error de sintaxis en su sugerencia (ponga paréntesis alrededor de '' John: '';-). –

0

Usted puede hacer una división en ":" y busque las apariciones de lo que busca en el primer elemento de la matriz resultante.

dir = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766']; 
for a in dir: 
    values = a.split(":") 
    if values[0] == "John": 
     print("John's number is %s" % (values[1])) 
+0

Un poco demasiado complicado, realmente no hay necesidad de dividir cada entrada. –

+0

Es cierto. ¡Esta es la única forma en que sé cómo hacerlo en Python! :-) Me encantó la respuesta "any". –

+0

Gracias Eso fue genial. –

1

Puesto que nadie ha recomendado este, sin embargo, me gustaría hacer:

all_johns = [p for p in PhoneDirectory if 'Joh' in p] 
0

Si el desempeño es importante para esta tarea utilizan algún SuffixTree aplicación. O simplemente haga que cualquier motor DBMS haga el trabajo de indexación.

3
if any(entry.startswith('John:') in entry for entry in PhoneDirectory) 

Pero me preparo algo con dos elementos como lista de cadenas no se adapta bien a la tarea:

PhoneList = ['John:009878788677' , 'Jefrey:67654654645' , 'Maria:8787677766'] 

numbers = { a:b 
      for item in PhoneList 
      for a,_,b in (item.partition(':'),) 
      } 

print numbers 
print "%s's number is %s." % ('John', numbers['John']) 
Cuestiones relacionadas