0
votes

Existe-t-il une fonction de python intégrée ou un module qui résumera les chiffres multipliés par leur poids entier?

Ce que je dois faire est de prendre un numéro ISBN à 10 chiffres et de vérifier s'il est valide, selon cette règle:

Selon l'édition 2001 du manuel officiel de l'Agence internationale de l'agence ISBN, [47] Le chiffre de contrôle ISBN-10 (qui est le dernier chiffre de l'ISBN à 10 chiffres) doit aller de 0 à 10 (symbole 'x 'est utilisé pour 10) et doit être tel que la somme des dix chiffres, multipliée par son poids (entier), descendant de 10 à 1, est un multiple de 11.

En d'autres termes, si le nombre est 0-306-40615-2, je dois calculer:

(0 * 10) + (3 * 9) + (3 * 9) + (3 * 9) + (3 * 9) + (0 * 8) + (6 * 7) + (4 * 6) + (0 * 5) + (6 * 4) + (1 * 3) + (5 * 2) + (2 * 1) MOD 11 < / Code>

Lorsque des suggestions ou des conseils sur la manière d'écrire une telle fonction sont les bienvenus, ma principale question est simplement si Python a déjà un moyen de faire cela, peut-être dans le maths Module.

C'est ma tentative, mais les boucles pour ne fonctionnent pas parce que l'intérieur continue de recommencer. De plus, il semble juste désordonné! xxx


0 commentaires

3 Réponses :


2
votes

Non, c'est trop spécifique pour être quelque chose dans une bibliothèque standard. Il est assez simple d'écrire cependant:

def check_isbn(isbn):
    checksum = 0
    weight = 10
    for ch in isbn:
        if ch == 'X':
            digit = 10
        elif ch.isdigit():
            digit = int(ch)
        else:
            continue
        checksum += digit * weight
        weight -= 1

    return checksum % 11 == 0


3 commentaires

Cela semble un peu trop intelligent. Peut-être que vous pourriez lier l'ISBN nettoyé à une variable puis l'énumérer dans une déclaration distincte?


@nneonneo assez juste.


Merci beaucoup! C'était très utile!



-1
votes

Si le nombre est 0-306-40615-2, et vous devez calculer si

​​(0 * 10) + (3 * 9) + (0 * 8) + (6 * 7) + (4 * 6) + (0 * 5) + (6 * 4) + (1 * 3) + (5 * 2) + (2 * 1)

est un multiple de 11 , alors vous pouvez simplement écrire une fonction simple. xxx


2 commentaires

Essayez ceci avec isbn = "0-9752298-0-x" (c'est un exemple réel, il devrait donc être vrai ).


Oui, cela pourrait fonctionner, à l'exception du "X", mais j'espérais écrire quelque chose un peu moins codé dur avec les chiffres. Comme certains des autres exemples, je voulais un moyen de générer ces valeurs pondérées au lieu de les taper à la main.



1
votes

Vous pouvez utiliser une liste de compréhension et énoncé () code> pour obtenir la position et la valeur des 9 premiers chiffres. Pour chaque chiffre, transformez la position dans son équivalent inversé (10-i) code> et le multiplie par le chiffre. Si vous soustrayez la somme de ces multiplications à partir de 990, vous obtiendrez une valeur qui rendra le total d'un multiple de 11. Le résultat peut ensuite être utilisé comme index dans une chaîne contenant des chiffres de 0 à 9 et de la lettre X:

isbn     = "0-306-40615-2"
numbers  = [int(n) for n in isbn if n.isdigit()]
check    = "0123456789X"[ (990-sum(n*(10-i) for i,n in enumerate(numbers[:9])))%11]
isValid  = isbn[-1] == check  

print(check) # "2"


2 commentaires

J'ai initialement mal interprété la question de la même manière que vous l'avez fait, comme "Calculer le chèque", mais la question est "prenant un numéro isbn à 10 chiffres et vérifiez s'il est valide". 0-306-40615-2 a déjà un chiffre de contrôle: c'est 2 . (Aussi - pas que cela compte - le chiffre de contrôle n'est pas une somme de contrôle; il s'agit d'un chiffre qui rend la somme de contrôle divisible par 11. Par exemple, si la somme de contrôle du modulo 11 est 9, le chiffre de contrôle doit être 2, pas 9. Vous pouvez Voir toutes ces erreurs dans l'histoire de ma réponse: p)


@Amadan, tu as raison. J'ai mal lu la règle. C'est corrigé maintenant.