Ma fonction renvoie une liste mais ne parvient pas à renvoyer la longueur de la liste.

Lorsque je renvoie la liste elle-même (commentée dans le code ci-dessous), elle réussit, mais en essayant de renvoyer la longueur de la liste, elle échoue, mais cela fonctionne généralement avec d'autres listes avec lesquelles je travaille ?? !!

J'ai essayé d'utiliser une variable de comptage que j'ai incrémentée de 1 chaque fois qu'une sous-liste était ajoutée à la liste mais en essayant d'imprimer le comptage, l'erreur ci-dessous s'est toujours produite. Vous pouvez également le voir commenté dans le code.

def count_combinations(number, integers_available, integers):

    combination_set = []
    # count = 0

    if sum(integers) == number:
        combination_set.append(integers)
        # count += 1
    elif sum(integers) > number:
        pass
    elif integers_available == []:
        pass
    else:
        for c in count_combinations(number, integers_available[:], integers+[integers_available[0]]):
            combination_set.append(c)
            # count += 1
        for c in count_combinations(number, integers_available[1:], integers):
            combination_set.append(c)
            # count += 1

    return len(combination_set)
    # return combination_set
    # return count

# Testing the code
number = 10
integers_available = [5, 2, 3]
print(count_combinations(number, integers_available, []))

Je m'attends à ce que le résultat soit 4 puisque la liste est:

[[5, 5], [5, 2, 3], [2, 2, 2, 2, 2], [2, 2, 3, 3]]

Mais j'obtiens l'erreur suivante:

Traceback (most recent call last):
  File "ask.py", line 22, in <module>
    print(count_combinations(number, integers_available, []))
  File "ask.py", line 12, in count_combinations
    for c in count_combinations(number, integers_available[:], integers+[integers_available[0]]):
  File "ask.py", line 12, in count_combinations
    for c in count_combinations(number, integers_available[:], integers+[integers_available[0]]):
TypeError: 'int' object is not iterable
0
RayMan 27 janv. 2019 à 00:18

3 réponses

Meilleure réponse

Votre fonction est récursive. Vous pouvez attendre de convertir la liste en une longueur à la fin du travail comme:

def get_combinations(number, integers_available, integers):

    combination_set = []
    # count = 0

    if sum(integers) == number:
        combination_set.append(integers)
        # count += 1
    elif sum(integers) > number:
        pass
    elif integers_available == []:
        pass
    else:
        for c in get_combinations(number, integers_available[:],
                                  integers + [integers_available[0]]):
            combination_set.append(c)
            # count += 1
        for c in get_combinations(number, integers_available[1:],
                                  integers):
            combination_set.append(c)
            # count += 1

    return combination_set

def count_combinations(number, integers_available, integers):
    return len(get_combinations(number, integers_available, integers))


# Testing the code
number = 10
integers_available = [5, 2, 3]
print(count_combinations(number, integers_available, []))
1
Stephen Rauch 26 janv. 2019 à 21:26

Vous utilisez get_combinations(number, integers_available, integers) comme fonction récursive, cette fonction renvoie donc return len(combination_set) la longueur de la liste combination_set = []. lorsque vous utilisez cette fonction comme

for c in get_combinations(number, integers_available[:], integers + [integers_available[0]]):

Puisque la fonction renvoie un entier qui est la longueur de la liste, ce qui précède pour chaque boucle signifie

for c in len(combination_set):

Remarque: disons que la longueur est 4

for c in 4: # throws 'int' object is not iterable exception.

Votre fonction doit donc renvoyer la liste et non la longueur de la liste Ce devrait être return combination_set

0
Solomon 26 janv. 2019 à 21:50

Supposons que le nombre est valide lorsqu'il n'est pas 0, vous pouvez alors essayer le code ci-dessous:

def get_combinations2(number, integers_available, integers):
     return len(integers_available)+len(integers)+1 if number != 0 else len(integers_available)+len(integers)
0
alexdabest 26 janv. 2019 à 22:05