2015-04-23 1 views
1

faire un exercice sur CheckIO et je me demande pourquoi cela ne fonctionnera pas. Étant donné un ensemble de chaînes, j'essaie de renvoyer True si l'une des chaînes est un suffixe d'une autre chaîne de l'ensemble. Faux sinon. En utilisant itertools, je génère d'abord les permutations nécessaires dans les tuples. Ensuite, pour chaque tuple (chaque i), je voulais voir à la dure si le deuxième tuple était à la fin du premier tuple (option 1). L'autre façon utilisait la fonction .endwith (option2), mais ni l'un ni l'autre ne fonctionnera pour moi. Pourquoi ces deux options sont-elles erronées?Python identifiant Suffixe dans l'ensemble des chaînes

import itertools 

def checkio(words_set): 
    for i in itertools.permutations(words_set, 2): 
    #option1 ---- if i[1] in i[0][-len(i[1]):]: 
    #option2 ---- if i[0].endswith(i[1]): 
      return True 
     else: 
      return False 

exemples:

checkio({"hello", "lo", "he"}) == True 

checkio({"hello", "la", "hellow", "cow"}) == False 

Je sais que cela fonctionne comme une réponse. Mais je me demandais juste pourquoi mes méthodes d'origine ne prendraient pas.

def checkio(words_set): 
    for w1 in words_set: 
     for w2 in words_set: 
      if w1.endswith(w2) and w1 != w2: 
       return True 
    return False 
+0

C'est un exercice, donc je voudrais juste suggérer penser à trier. –

Répondre

0

C'est parce que vous return False juste après la première vérification. et si cela échoue, il retournera False vous devez le mettre hors de votre boucle for!

Mais comme plus pythonique façon, vous pouvez utiliser combinations et une expression du générateur au sein any fonction:

>>> from itertools import combinations 
>>> s={"hello", "lo", "he"} 
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s,2))) 
True 
>>> s2={"hello", "la", "hellow", "cow"} 
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s2,2))) 
False 
+0

«C'est faux parce que vous vérifiez toujours i [0] .endswith (i [1]), mais vous avez besoin de i [1] .endswith (i [0]). »- itertools.permutations fait cela pour vous. – Arkanosis

+0

@Arkanosis Oui! j'ai manqué ça! Merci pour le rappel! – Kasramvd

0

Puisqu'il est un exercice, je ne vais pas vous donner la réponse complète, mais êtes-vous sûr que vous vraiment envie de return False dans la clause else?

1

Votre return False devrait être à la fin de la boucle, sinon la fonction retourne Vrai/Faux à chaque première comparaison et ignore toutes les comparaisons suivantes:

import itertools 

def checkio(words_set): 
    for i in itertools.permutations(words_set, 2): 
     if i[0].endswith(i[1]): 
      return True 

    return False