Python - comparar varios strings con una lista

   
Vista:

comparar varios strings con una lista

Publicado por Sergio (21 intervenciones) el 22/07/2017 20:26:05
Buenas tardes,

Quisiera saber si existe alguna forma de simplificar la siguiente expresion, o si por el contrario esta debe crecer con tantos ANDs como fueran necesarios....

1
if  "texto1" not in f.split('/')[3] and  "texto2" not in f.split('/')[3]:

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

comparar varios strings con una lista

Publicado por xve (1533 intervenciones) el 22/07/2017 20:39:28
Hola Sergio, puedes hacer algo así:
1
if not f.split('/')[3] in ["texto1","texto2"]:

Te sirve?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

comparar varios strings con una lista

Publicado por kip (220 intervenciones) el 22/07/2017 21:57:47
Hola, Xve sabes creo que esto se acercaria mas a lo que pide:

1
if not [s for s in 'texto1', 'texto2' if s in f.split('/')[3]]:

O tambien:

1
if not ("texto1" in f.split('/')[3] or "texto2" in f.split('/')[3]):

Ya que esta diciendo que ni 'texto1', ni 'texto2', se encuentren en alguna parte del string f.split('/')[3], con la linea que colocaste la comprobacion se haría mas a nivel de comparación, algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
f = 'a/a/a/OTROtexto1OTRO'
 
if  "texto1" not in f.split('/')[3] and  "texto2" not in f.split('/')[3]:
    print '1 .- No esta ninguno !'
 
if not [s for s in 'texto1', 'texto2' if s in f.split('/')[3]]:
    print '2 .- No esta ninguno !'
 
if not ("texto1" in f.split('/')[3] or "texto2" in f.split('/')[3]):
    print '3 .- No esta ninguno !'
 
if not f.split('/')[3] in ["texto1","texto2"]:
    print '4 .- No esta ninguno !'

Me mostrara:

1
4 .- No esta ninguno !

Tu evaluacion falla porque estas haciendo una comparación directa, si hacemos un cambio:

1
2
if not f.split('/')[3] in ["OTROtexto1OTRO","texto2"]:
    print '4 .- No esta ninguno !'

Funciona correctamente, ya que evalúa algo parecido a esto

1
f.split('/')[3] == 'OTROtexto1OTRO' or f.split('/')[3] == 'texto2' ...

Asi por cada valor en la lista.

Puede hacerse tambien con expresiones regulares, pero creo que es agregar complejidad al asunto:

1
2
3
4
5
6
import re
 
f = 'a/a/a/OTROOTRO'
 
if not re.search(r'texto1|texto2', f.split('/')[3]):
    print 'Ninguno !'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

comparar varios strings con una lista

Publicado por Sergio (21 intervenciones) el 23/07/2017 11:49:34
Buenos días,

Pues el tema de la expresiones regulares no lo veo tan descabellado. Habia conseguido encontrar esta solución, pero claro, tiene algunas restricciones que parece importantes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string = "texto1 texto2 texton"
diccionario = ["texto1", "texto2"]
 
s1 = set(string.split())
s2 = set(diccionario)
 
print (s1.intersection(s2))
 
Las solcuiones planteadas, me gustan y funciona deluxe
 
if not [s for s in 'texto1', 'texto2' if s in f.split('/')[3]]:
 
y
 
import re
 
f = 'a/a/a/OTROOTRO'
 
if not re.search(r'texto1|texto2', f.split('/')[3]):
 
    print 'Ninguno !'

Luego ya se puede mejorar pasando todo a mayusculas o minusculas, por si viniera Texto, texto, TEXTO, etc... pero eso hacer un upper o lower y ya. Gracias chicos¡¡

Por cierto, sabeis de algun libro, manual, tutorial, etc, que merezca muy mucho la pena tener en la biblioteca?

Un Cordial Saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad