Dans le code suivant, je renvoie la valeur entière pour le nombre de nombres consécutifs dans une chaîne donnée.

def consecutive_length(S):
    if S == '':
        return 0
    if len(S) == 1:
        return 1
    if S[0] == S[1]:
        return 1 + consecutive_length(S[1:])
    return 1

def compress(S):
    if S == '':
        return 0
    cons_length = consecutive_length(S)
    return [cons_length] + [compress(S[cons_length:])]

Lorsque j'exécute cette instruction d'impression, ce qui suit est renvoyé:

>>> print (compress('1111000000001111000111111111111111'))
[4, [8, [4, [3, [15, 0]]]]]

Où je veux vraiment que les éléments suivants soient retournés:

>>> print (compress('1111000000001111000111111111111111'))
[4, 8, 4, 3, 15]
1
jape 9 mars 2016 à 02:31

3 réponses

Meilleure réponse

Lorsque vous renvoyez une liste, [what_is_returned] sera une liste imbriquée, mais lorsque vous retournerez un entier, ce ne sera qu'une liste. Au lieu de cela, (dans compress()), renvoyez toujours une liste et supprimez les crochets lorsque vous utilisez ce qu'elle renvoie:

def consecutive_length(S):
    if S == '':
        return 0
    if len(S) == 1:
        return 1
    if S[0] == S[1]:
        return 1 + consecutive_length(S[1:])
    return 1

def compress(S):
    if S == '':
        return []
    cons_length = consecutive_length(S)
    return [cons_length] + compress(S[cons_length:])
0
zondo 8 mars 2016 à 23:50

Voici:

def consecutive_length(S):
    if S == '':
        return 0
    if len(S) == 1:
        return 1
    if S[0] == S[1]:
        return 1 + consecutive_length(S[1:])
    return 1

def compress(S):
    if S == '':
        return []
    cons_length = consecutive_length(S)
    return [cons_length] + compress(S[cons_length:])
1
EduardoCMB 8 mars 2016 à 23:50

Une alternative à votre méthode consiste à utiliser itertools.groupby():

from itertools import groupby

s = '1111000000001111000111111111111111'
answer = [len([digit for digit in group[1]]) for group in groupby(s)]
print(answer)

Sortie

[4, 8, 4, 3, 15]
1
gtlambert 8 mars 2016 à 23:36