Jump to content

ver se algo de uma cadeia está dentro da outra e responder adfirmativamente ou nao


Recommended Posts

Posted (edited)

eu fiz assim, mas nao está a dar certo

o que estou a errar?

def a(c1, c2):


   if c2 in c1:
       print 'a cadeia 2 tem algo da cadeia 1'
   else:
       print 'a cadeia 2 nao tem nada da cadeia 1'

if __name__=='__main__':
   a('abcd', 'trcd')
Edited by thoga31
GeSHi
Posted

Em principio estás a errar em tudo 🙂

Estás a assumir que o c2 in c1 vai verificar se existem letras de c2 no c1.

if set(c2).isdisjoint(c1):
   print 'a cadeia 2 nao tem nada da cadeia 1'
else:
   print 'a cadeia 2 tem algo da cadeia 1'

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Em principio estás a errar em tudo 🙂

Estás a assumir que o c2 in c1 vai verificar se existem letras de c2 no c1.

if set(c2).isdisjoint(c1):
print 'a cadeia 2 nao tem nada da cadeia 1'
else:
print 'a cadeia 2 tem algo da cadeia 1'

eu quero que o computador veja que as duas cadeias têm o cd logo a c1 tem algo da c2, neste caso tem 2 letras.

nao entendo a tua solução, o que é isso do isdisjoint?

Posted

Basicamente serve para verificar se um set não tem elementos em comum com o outro (retorna True ou False). Mas isso funciona ao nível de caracteres e sem referência à posição deles em cada um. Ou seja, basta terem 1 char em comum.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Existe um módulo de Python nativo com o qual consegues o que pretendes com alguma facilidade: http://docs.python.org/library/difflib.html#sequencematcher-objects

Vê o exemplo abaixo.

In [22]: import difflib as d

In [23]: a = "abxcd"

In [24]: b = "abcd"

In [25]: s = d.SequenceMatcher(None, "abxcd", "abcd")

In [26]: s.get_matching_blocks()
Out[26]: [Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]

In [27]: a[0:0+2]
Out[27]: 'ab'

In [28]: b[0:0+2]
Out[28]: 'ab'

In [29]: a[3:3+2]
Out[29]: 'cd'

In [30]: b[2:2+2]
Out[30]: 'cd'

Repara que a seguir a fazer os matching blocks chamei os índices que ele indicou. Por exemplo a string a do indice 3 a 3 + size (no exemplo size=2) é igual a b de 2 a 2 +size.

Posted

Há tantas formas de definir a função, e todas elas interessantes à sua maneira 🙂

Eis mais uma:

def contem(c1, c2):
   return "a cadeia 2 nao tem nada da cadeia 1" if set(c1) & set(c2) == set() else "a cadeia 2 tem algo da cadeia 1"

Knowledge is free!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.