2016-06-29 10 views
0

Ich muss eine Funktion schreiben, die eine 13-stellige ISBN validiert. Es muss mit 978 oder 979 beginnen, mit einer einzelnen Ziffer enden und die restlichen Abschnitte müssen mindestens 1 Ziffer lang sein. Ich brauche Hilfe, diese Arbeit zu machen, die ich nicht verstehe, warum es nie true zurückpython isbn 13-stellig validieren

def validate(s) 
lst = s.split("-") 
isbn= False 
if lst[0] == "978" or lst[0] == "979": 
    if len(lst[1])>=1 and len(lst[2])>=1: 
     if len(lst[3])==1: 
      isbn= True 
return isbn 
+0

Geben Sie eine Beispieleingabe an, bei der ein Fehler auftritt. – SuperSaiyan

+0

978-3-16-148410-0 würde passen, 978-3-16-148410 würde fehlschlagen – Miryloth

+0

Mögliches Duplikat von [Wie benutze ich Python, um alle isbn in einer Textdatei zu finden?] (Http://stackoverflow.com/ Fragen/14258720/how-to-Use-Python-zu-finden-alles-isbn-in-einem-Text-Datei) – PyNEwbie

Antwort

1

Sie reguläre Ausdrücke verwenden sollten, und das ist genau, warum es für verwendet wird:

>>> import re 
>>> def validate(isbn): 
     isbn_regex = re.compile('^(978|979)-\d+-\d+-\d$') 
     return isbn_regex.search(isbn) is not None 

>>> print validate('978-12-12-2') 
    True 

Hinweis: Dies funktioniert gemäß Ihrer Logik in dem obigen Code (außer Sie haben nicht überprüft, ob es eine Ziffer ist).

+0

Seltsamerweise funktioniert diese Regex nicht für echte ISBN-13-Codes, nur für solche, die dem ungültigen Format des OPs folgen :) @Miryloth: Sie müssen das Regex-Muster in dieser Antwort anpassen, um mit echten ISBN-13-Codes zu arbeiten, z. '^ 97 (8 | 9) (- \ d +) {4} $'. Schließlich sollten Sie die Prüfziffer überprüfen. – mhawke

+0

Ja der Grund, warum ich sagte, es funktioniert genau wie Ops Logik! – wolframalpha

0

Eine ISBN-13 besteht aus fünf Zahlengruppen und die letzte Ziffer ist eine Prüfziffer. Hier ist eine Funktion, um sicherzustellen, dass es fünf Gruppen gibt, genau 13 Ziffern, und validiert die Prüfziffer. Es funktioniert mit Ihren Proben:

import re 

def validate(s): 
    d = re.findall(r'\d',s) 
    if len(d) != 13: 
     return False 
    if not re.match(r'97[89](?:-\d+){3}-\d$',s): 
     return False 

    # The ISBN-13 check digit, which is the last digit of the ISBN, must range from 0 to 9 
    # and must be such that the sum of all the thirteen digits, each multiplied by its 
    # (integer) weight, alternating between 1 and 3, is a multiple of 10. 
    odd = [int(x) for x in d[::2]] 
    even = [int(x)*3 for x in d[1::2]] 
    return (sum(odd)+sum(even)) % 10 == 0 

trials = '''\ 
978-3-16-148410-0 
978-3-16-148410 
978-0-306-40615-7 
978-0306-40615-7 
979-11111-11-11-2 
978-7654-321-12-4 
977-7654-321-12-4 
978-7654-321-1-41 
978-7654-321-1-4 
978-7654-321-122-4 
'''.splitlines() 

for trial in trials: 
    print(validate(trial),trial) 

Ausgang:

True 978-3-16-148410-0 
False 978-3-16-148410  # too few numbers and groups  
True 978-0-306-40615-7 
False 978-0306-40615-7  # too few groups 
True 979-11111-11-11-2 
False 978-7654-321-12-4  # wrong check digit 
False 977-7654-321-12-4  # didn't start with 978 or 979 
False 978-7654-321-1-41  # didn't end in one digit. 
False 978-7654-321-1-4  # too few digits 
False 978-7654-321-122-4  # too many digits 
1

ISBN-13 13 Ziffern erfordert ihre Gültigkeit. Ihr Code überprüft nicht, ob alle Zeichen Ziffern sind (mit Ausnahme des Trennzeichens -), und überprüft nicht die tatsächliche Länge. Außerdem sind fünf Teile erforderlich, und Sie könnten die Prüfziffer überprüfen.

Insbesondere Code nicht immer True zurückkehren, weil das vierte Segment (lst[3]) prüft, ob genau ein Zeichen (if len(lst[3])==1:) jedoch, dass Element typischerweise länger sein als 1 Stelle.

Es gibt über PyPI verfügbare Python-Bibliotheken, die ISBN-Codes validieren können. Hier ist ein Beispiel isbnlib mit:

>>> import isbnlib 
>>> isbnlib.is_isbn13('978-3-16-148410-0') 
True 
>>> isbnlib.is_isbn13('978-3-16-148410-5') 
False 
>>> isbnlib.is_isbn13('978-3-16-148410-A') 
False 
>>> isbnlib.is_isbn13('979-3-16-148410-9') 
True 

Eine andere, weniger Gewicht Bibliothek ist pyisbn:

>>> import pysisbn 
>>> pyisbn.validate('979-3-16-148410-9') 
True 
>>> pyisbn.validate('979-3-16-148410-0') 
False 

Der Vorteil dieser Bibliotheken verwenden, die nicht sparen Sie den Aufwand zu parsen ISBN selbst reiht, ist, dass sie bieten zusätzliche Funktionen wie die Konvertierung von ISBN-13 zu ISBN-10.

0

Fehler 1: Fehlender Doppelpunkt am Ende der 'def' Anweisung.

Fehler 2: Die Anweisung 'return isbn' ist nicht eingerückt; Es ist außerhalb der Funktion, sollte aber innen sein.

Fehler 3: Die Zeile, die die Länge von lst [3] überprüft, überprüft nicht das letzte Element der isbn-Zeichenfolge, wenn mehr als vier Elemente in lst vorhanden sind.

Der Split-Befehl erstellt fünf Elemente in lst für Ihre erste Zeichenfolge, 978-3-16-148410-0; aber lst [3] hat 6 Ziffern und der Länge-Test schlägt fehl.

Der Split-Befehl erstellt vier Elemente in lst für Ihre zweite Zeichenfolge, 978-3-16-148410; aber lst [3] hat 6 Ziffern und der Länge-Test schlägt fehl.

Verwenden Sie lst [-1], um das letzte Element von lst anzugeben, unabhängig davon, wie viele Elemente es enthält. Wenn Ihr i/p richtig formatiert ist, sollte das o/p korrekt sein.