2010-05-06 27 views
20

Estoy tratando de buscar a tientas a través de python, y aprender la mejor manera de hacer las cosas. Tengo una cadena en la que estoy haciendo un comparar con otra cadena para ver si hay una coincidencia:Comparar cadena con todos los valores en el conjunto

if paid[j].find(d)>=0: 
    #BLAH BLAH 

Si 'd' eran una matriz, lo que es la forma más eficiente para ver si la cadena contenida en pagado [j] tiene una coincidencia con cualquier valor en 'd'?

+0

¿Puedes explicar a qué te refieres con 'una coincidencia con cualquier valor en 'd''? ¿Qué consideras que es un "partido"? ¿Requiere que las cuerdas sean idénticas? –

+1

Gracias por su respuesta. Sí, me refiero a las listas. Lo siento, sigo aprendiendo. Quería ver si había una coincidencia de patrón entre pagado [j] (una oración) y cualquiera de las palabras en la lista 'd'. – Nathan

Respuesta

38

Si sólo desea saber si cualquier artículo de d está contenida en paid[j], ya que literalmente dice:

if any(x in paid[j] for x in d): ... 

Si también desea para saber que artículos de d están contenidos en paid[j]:

contained = [x for x in d if x in paid[j]] 

contained habrá una lista vacía si no hay elementos de d están contenidas en paid[j].

hay otras soluciones sin embargo, si lo que quiere es otra alternativa, por ejemplo, consigue el artículo primera de d contenida en paid[j] (y None si no hay ningún elemento es tan contenida):

firstone = next((x for x in d if x in paid[j]), None) 

BTW , ya que en un comentario mencionas oraciones y palabras, tal vez no necesariamente quieres una cadena verificar (que es lo que están haciendo todos mis ejemplos), porque no pueden considerar límites de palabras, por ejemplo, cada ejemplo dirá que 'cat' es in 'ofuscar' (porque 'ofuscar' contiene 'cat' como una subcadena). Para permitir controles en los límites de palabras, en lugar de simples comprobaciones de subcadenas, puede utilizar expresiones regulares de forma productiva ... pero le sugiero que abra una pregunta por separado sobre eso, si eso es lo que necesita: todos los fragmentos de código en esta respuesta, dependiendo según sus requisitos exactos, funcionará igual de bien si cambia el predicado x in paid[j] en un predicado más sofisticado como somere.search(paid[j]) para un objeto RE apropiado somere. (Python 2.6 o mejor - ligeras diferencias en 2.5 y anteriores).

Si su intención es otra cosa, como por ejemplo conseguir uno o todos los índices en d de los artículos que cumplan sus restricción, hay soluciones fáciles para los diferentes problemas, también ... pero, si lo que En realidad, lo que necesito es estar tan lejos de lo que dijiste, será mejor que dejes de adivinar y espero que lo aclares ;-).

+0

Esta es una excelente explicación, gracias. Mi objetivo es analizar todo este código html buscando enlaces. Una vez que tengo una lista de ellos, voy a través de esa lista y la comparo con la lista maestra 'd'. La razón por la que quiero comparar cadenas de coincidencias es que puedo encontrar un enlace en el html analizado que va a domain.com, pero no coincide con nada en 'd', aunque me gustaría que coincida con www.domain.com . De su explicación, esto lograría lo que quiero, ¿verdad? si hay (x en pagado [j] para x en d): ... – Nathan

+0

@Halik, sí, siempre y cuando también desee encontrar (por ejemplo) 'notreallywww.domain.com' y' www.domain.com .fooledya.org'. Si no quieres tales coincidencias falsas, necesitas un enfoque más sofisticado que el simple emparejamiento de cadenas. Pero la parte 'if any (...' sigue siendo correcta, solo que con un predicado diferente (mejor abre una pregunta aparte para esa parte) –

+0

¡Gracias! Acabo de abrir una nueva pregunta sobre este tema. – Nathan

6

Supongo que quiere decir list y no array? Existe una matriz en Python, pero la mayoría de las veces desea una lista en lugar de una matriz.

La manera de comprobar si una lista contiene un valor es utilizar in:

if paid[j] in d: 
    # ... 
2

En Python es posible utilizar el operador in. Usted puede hacer cosas como esta:

>>> "c" in "abc" 
True 

Teniendo esto aún más, se puede comprobar si hay estructuras complejas, como tuplas:

>>> (2, 4, 8) in ((1, 2, 3), (2, 4, 8)) 
True 
0
for word in d: 
    if d in paid[j]: 
     do_something() 

va a tratar todas las palabras en la lista d y comprobar si se pueden encontrar en la cadena paid[j].

Esto no es muy eficiente ya que paid[j] tiene que escanearse nuevamente para cada palabra en d. También podría usar dos conjuntos, uno compuesto por las palabras en la oración, uno de su lista, y luego mirar la intersección de los conjuntos.

sentence = "words don't come easy" 
d = ["come", "together", "easy", "does", "it"] 

s1 = set(sentence.split()) 
s2 = set(d) 

print (s1.intersection(s2)) 

Salida:

{'come', 'easy'} 
Cuestiones relacionadas