2017-03-29 1 views
0

J'essaye d'écrire une fonction qui prend en compte une liste de flottants et détermine s'il y a ou non une séquence répétée de nombres dans cette liste. S'il y a une séquence répétée, alors il compte les nombres dans cette séquence.Python: Recherche de la longueur de la séquence répétée de nombres dans une chaîne de flottants

Ces exemples sont ce que je veux que ma fonction pour faire

Exemple 1:

function = '1.0 8.0 4.0 2.0 1.0 8.0 4.0 2.0 1.0 8.0 4.0 2.0 1.0 8.0' 
result = find_repeating_sequence(function) 
# repeating sequence = 1.0, 8.0, 4.0, 2.0 
# so result should equal 4 in this case 

Exemple 2:

function = '1.0 8.0 4.0 1.0 2.0 1.0 8.0 4.0 1.0 2.0 1.0 8.0' 
result = find_repeating_sequence(function) 
# repeating sequence = 1.0, 8.0, 4.0, 1.0, 2.0 
# so result should equal 5 in this case 

Exemple 3:

function = '1.0 8.0 4.0 2.0 1.0 7.0 6.0 3.0 2.0 5.0 9.0' 
result = find_repeating_sequence(function) 
# repeating sequence doesn't exist 
# so result should equal None in this case 

Exemple 4 :

function = '1.0 11.0 1.0 11.0 1.0 11.0 1.0 11.0 1.0 11.0 1.0 11.0 1.0 11.0 1.0 11.0' 
result = find_repeating_sequence(function) 
# repeating sequence = 1.0, 11.0 
# so result should equal 2 in this case 

Jusqu'à présent, ce que j'ai est:

def find_repeating_sequence(function): 
     regex = re.compile(r'(.+ .+)(\1)+') 
     match = regex.search(function) 
     result = match 

     if result == None: 
      print "There was no repeating sequence found!" 
     else: 
      print "Repeating sequence found!" 
      print match.group(1) 
      result = match.group(1) 

     return result 

Cela fonctionne pour tous les exemples dans le sens où match.group(1) donne la séquence répétitive. Toutefois, pour une raison quelconque, len(match.group(1)) ne renvoie pas le nombre correct.

Comme pour l'exemple 1:

print match.group(1) donne 1.0 8.0 4.0 2.0

Mais print len(match.group(1)) donne 15

il ne retourne pas aussi la valeur correcte pour l'exemple 4: print match.group(1) donne 1.0 11.0 1.0 11.0 1.0 11.0 1.0 11.0

Et print len(match.group(1)) donne 35

Qu'est-ce que je fais mal?

MISE À JOUR:

Merci à l'une des réponses ci-dessous, je l'ai résolu le problème en utilisant print len(match.group(1)) len (match.group (1) .split())

Toutefois, pour une raison quelconque si function = 1.0 2.0 4.0 8.0 1.0 2.0 4.0 8.0 1.0 2.0 4.0 8.0 1.0 2.0 4.0 8.0 print match.group(1) donne 1.0 2.0 4.0 8.0 1.0 2.0 4.0 8.0 et non 1.0 2.0 4.0 8.0

+0

1,0 8,0 4,0 2,0 1,0 8,0 4.0 2.0 n'est pas contenu dans votre chaîne de recherche, avez-vous mélangé les chiffres? – radicarl

+0

@radicarl Excuses, oui j'ai copié le mauvais numéro. J'ai maintenant rectifié cette erreur dans la question. – Catherine

Répondre

1

match.group() retourne une chaîne et dans ce cas len() retourne t Le nombre de caractères dans la chaîne.

vous pouvez diviser votre chaîne par l'espace, puis compter le nombre d'éléments

Réponse à la mise à jour: votre expression est avide, il essaie de trouver le plus long match. Essayez (.+? .+?)(\1)+?. Le questionmark après un qualificatif rend l'expression rationnelle paresseux:

https://regex101.com/r/1w7nxD/1

+0

Merci, cela a fonctionné parfaitement pour moi! – Catherine

+0

Un peu d'optimisation: https://regex101.com/r/1w7nxD/2 –