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. P> blockQuote>
En d'autres termes, si le nombre est 0-306-40615-2, je dois calculer: P>
(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> p>
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 code> Module. P>
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é! P>
xxx pré> p>
3 Réponses :
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
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!
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) p>
est un multiple
Essayez ceci avec isbn = "0-9752298-0-x" code> (c'est un exemple réel, il devrait donc être
vrai code>).
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.
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"
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 code> a déjà un chiffre de contrôle: c'est
2 code>. (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.