Grundrisse von Python!!
Hallo,
Da ich eine absolute Null bin dachte ich mir mal das ich mir Hilfe hohl. Zwar habe ich schon mit PHP programmiert jedoch noch nicht mit Python und deswegen wollte ich einfahc mal fragen, was so die Grundrisse von Python sind?
Ein weiters Problem ist, dass ich eine ISBN-Nummer (3-342-65354-9)
ohne Striche brauch und deswegen lautet mein Frage, wie schaffe ich es denn das ich nur noch zahlen da stehen hab und keine Striche mehr!
Ok schonmal danke im vorraus.
mfg Walker26
Da ich eine absolute Null bin dachte ich mir mal das ich mir Hilfe hohl. Zwar habe ich schon mit PHP programmiert jedoch noch nicht mit Python und deswegen wollte ich einfahc mal fragen, was so die Grundrisse von Python sind?
Ein weiters Problem ist, dass ich eine ISBN-Nummer (3-342-65354-9)
ohne Striche brauch und deswegen lautet mein Frage, wie schaffe ich es denn das ich nur noch zahlen da stehen hab und keine Striche mehr!
Ok schonmal danke im vorraus.
mfg Walker26
Hi. Zu ersterem kann ich dir den Eintrag in der Wikipedia empfehlen, da stehen die gröbsten Grundrisse und Philosophien zu Python. Dann würde ich dir als Einstieg empfehlen die dt. Übersetzung des Pythontutorials von der Pythonhomepage durchzuarbeiten, dann kannst du schon mal mit Python umgehen. Und den Rest findest du eigentlich immer dann, wenn du ihn brauchst bzw auf Anfrage hier
Zu deinem kleinem Problem:
mfg Milan
Zu deinem kleinem Problem:
Code: Alles auswählen
isbn="3-342-65354-9"
isbn=isbn.replace("-","")
print isbn
Ok erst einmal ein super dankeschön von mir, aber das mit der ISBN-Nummer muss für alle gehen die ich eingebe, meine nummer war einfach nur ein Beispiel, kannst du mir das vielleicht noch mal für jede ISBN-Nummer implementieren? aber wen du lust hast, kann ich dir auch meinen algorithmus schicken und du schaust dir das dann mal an!!
Nochmal DANKE!!
Nochmal DANKE!!
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
dazu musst du nur einfach deine eingaben einlesen und dasselbe machen, wenn du die isbn noch überprüfen willst musst du halt ein bisschen rechnen, aber wenn du das tutorial durch hast wird das schon gehen
gruss
dazu musst du nur einfach deine eingaben einlesen und dasselbe machen, wenn du die isbn noch überprüfen willst musst du halt ein bisschen rechnen, aber wenn du das tutorial durch hast wird das schon gehen
gruss
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi Walker26,
die Version von Milan geht für alle ISBN-Nummern, die ein "-" in der Ziffernfolge haben, wie von dir gewünscht. Hier eine Version die aus einer beliebigen Zeichenfolge nur die Zahlen überlässt:
Gruß
Dookie
die Version von Milan geht für alle ISBN-Nummern, die ein "-" in der Ziffernfolge haben, wie von dir gewünscht. Hier eine Version die aus einer beliebigen Zeichenfolge nur die Zahlen überlässt:
Code: Alles auswählen
isbn = "0-8_15+4\\/7abc11"
ziffern = "".join([a for a in isbn if a.isdigit()])
print ziffern
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
Hi. Das ist aber fehlerhaft... die letzte Ziffer ist die Prüfsumme von 11, falls die genau auf 10 landet schreibt man da ein X hin. Das musst du beachten... Am einfachsten bleibts natürlich, wenn man einfach die "-" ausradiert. Hier ganz exaktDookie hat geschrieben:Hi Walker26,
die Version von Milan geht für alle ISBN-Nummern, die ein "-" in der Ziffernfolge haben, wie von dir gewünscht. Hier eine Version die aus einer beliebigen Zeichenfolge nur die Zahlen überlässt:Code: Alles auswählen
isbn = "0-8_15+4\\/7abc11" ziffern = "".join([a for a in isbn if a.isdigit()]) print ziffern
Gruß
Dookie
Code: Alles auswählen
isbn = "0-8_15+4\\/7abc11"
ziffern=""
anz=0
for a in isbn:
if a.isdigit() and anz<=9:
ziffern+=a
anz+=1
psum=reduce(lambda a,b:a+int(b),ziffern) % 11
ziffern+= (psum == 10) and "x" or str(psum)
print ziffern
Ok wieder einmal ein Dankeschön an euch!!
@ milan:
Da hab ich mal ne Frage und zwar könntest du mir die Schritte vielleicht etwas näher erläutern? Tut mir Leid falls ich vielleicht etwas schwer von begriff bin, reicht einfach wenn du einen satz zu jeder zeile schreiben würdest!!
Unsere Strategie ist aber die:
a1a2a3.....a10:Eingabe ohne Bindestriche (a1*10+a2*9+....+a10*1)/11
Vielleicht habt ihr dies ja auch angewendet, dann hab ichs falsch verstanden aber ein paar erläuterungen wären super nett und für mich echt hilfreich!
@ milan:
Da hab ich mal ne Frage und zwar könntest du mir die Schritte vielleicht etwas näher erläutern? Tut mir Leid falls ich vielleicht etwas schwer von begriff bin, reicht einfach wenn du einen satz zu jeder zeile schreiben würdest!!
Unsere Strategie ist aber die:
a1a2a3.....a10:Eingabe ohne Bindestriche (a1*10+a2*9+....+a10*1)/11
Vielleicht habt ihr dies ja auch angewendet, dann hab ichs falsch verstanden aber ein paar erläuterungen wären super nett und für mich echt hilfreich!
Hast du ja auch fast Recht, ich hab mich in der Formel vertan. Mehr Infos dazu findest du, wenn du hier nach "isbn" suchst (allerdings reichlich umständlich)...
Neuer Code für die Prüfsumme :
Nun werden 9 Ziffern aus dem String ziffern ausgelesen und aus diesen wird die 10., die Prüfsumme berechnet und an ziffern angefügt. Die Prüfsumme berechne ich, indem ich erst jeden Buchstaben einzeln in eine Zahl umwandle und mit seiner Position im String multiplizieren (i+1)*int(a). Dann habe ich eine Liste von zahlen, die ich addieren muss, daas macht für mich die Funktion reduce. Schließlich wird modulo 11 genommen.
Die nächste Zeile setzt dann entweder ein "x" dran (falls psum gleich 10 ist) oder halt den entsprechenden Rest. Auch hier war ich faul, wahrscheinlich wäre eine if-Abfrage verständlicher gewesen . Aber das sollte eigentlich alles im Tutorial zu finden sein, es ist quasi Handwerkszeug mit dem man in Python bequem arbeiten kann .
Neuer Code für die Prüfsumme :
Code: Alles auswählen
psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
Die nächste Zeile setzt dann entweder ein "x" dran (falls psum gleich 10 ist) oder halt den entsprechenden Rest. Auch hier war ich faul, wahrscheinlich wäre eine if-Abfrage verständlicher gewesen . Aber das sollte eigentlich alles im Tutorial zu finden sein, es ist quasi Handwerkszeug mit dem man in Python bequem arbeiten kann .
Also diesen Code den du mir zu letzt geschickt hast, soll ich dann in das Formular vorher einfügen oder?
Danke
Danke
So wäre das jetzt richtig oder:
Wenn du Zeit hast könntest du mir ja auch die ersten Zeilen erklären, wäre super nett musst du aber nicht!!
Recht herzlichen dank nochmal!
Code: Alles auswählen
isbn = "0-8_15+4\\/7abc11"
ziffern=""
anz=0
for a in isbn:
if a.isdigit() and anz<=9:
ziffern+=a
anz+=1
psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
ziffern+= (psum == 10) and "x" or str(psum)
print ziffern
Recht herzlichen dank nochmal!
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
ich hab erstmal Deinen Code in Pythontags gesetzt. Das kannst Du in Zukunft auch selber machen, einfach den Code in <python>...</python> setzen. dabei die < und > durch [ und ] ersetzen. So bleiben die, bei Python so wichtigen, Einrückungen erhalten und durch das Syntaxhighlighting ist der Code auch besser lesbar.
Ich werd mal milans Code auseinanderplücken und eventuell ver(schlimm)bessern
anzahl brauch ich bei meiner Versiondann nicht
Mit if a.isdigit() and anz<=9: wird getestet, ob a eine Ziffer ist und ob die Anzahl der bisher gefundenen Zeichen kleiner oder gleich 9 ist.
ziffern+=a fügt zum String ziffern das gefundene Zeichen a hinten an und anz+=1 erhöht den Zähler der Ziffern um eins.
Meine Version erzeugt aus dem String in isbn mit
[a for a in isbn if a.isdigit()] eine Liste mit allen Zeichen die eine Ziffer sind. Das [:9] holt aus der Liste die ersten 9 Einträge. Diese werden mit "".join(...) wieder zu einem String zusammengeführt.
In beiden Fällen haben wir jetzt die ersten 9 Ziffern aus der ISBN in einem 9-Zeichen langen String.
reduce(lambda a,b: a+b, iterable)kann zum Zusammenzählen der Werte einer Reihe von Werten (iterable) verwendet werden.
enumerate(iterable) erzeugt einen Iterator, der die Elemente z.B einer Liste und deren Index zurückgibt. Hier steckt auch der Fehler, der Ersten Zahl wird hier 0 zugewiesen und der letzten 8. Im Ausdruck (i+1)*int(a) wird zwar 1 hinzugezählt, sollte aber 2 Hinzugezählt werden, aber auch die Wertigkeit ist genau verkehrt herum.
berechnet jetzt die richtige Checksumme. sum(iterable) ersetzt das reduce(lambda a, b: a+b, iterable) und enumerate(ziffern[::-1]) dreht den String in ziffern um bevor die Liste mit den Ziffern und Wertigkeiten (um 2 reduziert) werden.
Ich würd das dann so machen:
Gruß
Dookie
Ich werd mal milans Code auseinanderplücken und eventuell ver(schlimm)bessern
Initialisierung, besser nehmen wir eine gültige ISBNCode: Alles auswählen
isbn = "0-8_15+4\\/7abc11" ziffern="" anz=0
Code: Alles auswählen
isbn = "ISBN 0-8436-1072-7"
Hier werden die ersten 9 Ziffern aus dem String rausgefiltert. Hier wird mit for a in isbn: an a nacheinander jedes Zeichen aus isbn zugewiesen.Code: Alles auswählen
for a in isbn: if a.isdigit() and anz<=9: ziffern+=a anz+=1
Mit if a.isdigit() and anz<=9: wird getestet, ob a eine Ziffer ist und ob die Anzahl der bisher gefundenen Zeichen kleiner oder gleich 9 ist.
ziffern+=a fügt zum String ziffern das gefundene Zeichen a hinten an und anz+=1 erhöht den Zähler der Ziffern um eins.
Code: Alles auswählen
ziffern = "".join([a for a in isbn if a.isdigit()][:9])
[a for a in isbn if a.isdigit()] eine Liste mit allen Zeichen die eine Ziffer sind. Das [:9] holt aus der Liste die ersten 9 Einträge. Diese werden mit "".join(...) wieder zu einem String zusammengeführt.
In beiden Fällen haben wir jetzt die ersten 9 Ziffern aus der ISBN in einem 9-Zeichen langen String.
Das ist jetzt ein Dicker Hund, der auch noch einen Fehler enthält.Code: Alles auswählen
psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
reduce(lambda a,b: a+b, iterable)kann zum Zusammenzählen der Werte einer Reihe von Werten (iterable) verwendet werden.
enumerate(iterable) erzeugt einen Iterator, der die Elemente z.B einer Liste und deren Index zurückgibt. Hier steckt auch der Fehler, der Ersten Zahl wird hier 0 zugewiesen und der letzten 8. Im Ausdruck (i+1)*int(a) wird zwar 1 hinzugezählt, sollte aber 2 Hinzugezählt werden, aber auch die Wertigkeit ist genau verkehrt herum.
Code: Alles auswählen
psum = 11 - sum([(i+2)*int(a) for i,a in enumerate(ziffern[::-1])]) % 11
hängt jetzt psum als Zeichen an ziffern an, wobei der fall 10 als "x" angehängt wird oder einfach psum als Nummer.Code: Alles auswählen
ziffern+= (psum == 10) and "x" or str(psum)
Ich würd das dann so machen:
Code: Alles auswählen
ziffern += "0123456789X"[psum]
gibt dann die isbn ohne "-" aus.Code: Alles auswählen
print ziffern
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
*hehehe*... warum hab ich nur das Gefühl, zuviele Köche verderben den Brei ... Wenn man sich das ganze mathematisch aufschreibt wird man sehen, das es dasseble ist, Dookie. Durch die andere Reihenfolgen kann ich mir nämlich das 11 - (x%11) sparen . Das war schon richtig so (zur Not testen). Modulosachen zu analysieren macht natürlich immer Spaß *g* (bitte nimm bei dir auch psum hinterher nochmal modulo 11, sonst bekommste irgendwann man psum ==1 ). Aber die Idee mit dem sum ist net schlecht . Ok, noch mal zusammengedrößelt:Dookie hat geschrieben:Das ist jetzt ein Dicker Hund, der auch noch einen Fehler enthält.Code: Alles auswählen
psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
Code: Alles auswählen
isbn = "ISBN 0-8436-1072-7"
ziffern = "".join([a for a in isbn if a.isdigit()][:9]) #gefällt mir auch besser
psum=sum([(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
ziffern += "0123456789X"[psum]
print ziffern
Zuletzt geändert von Milan am Samstag 18. September 2004, 15:02, insgesamt 1-mal geändert.
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
ok, doch kein fehler, das selbe ist's aber nicht, nur rauskommen tut das gleiche
Hoffen wir mal, daß walker jetzt noch durchblickt.
Gruß
Dookie
Hoffen wir mal, daß walker jetzt noch durchblickt.
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
Sorry, da könntest du recht haben, das wäre ein wenig kompliziert. Ich versuchs auch mal zu erklären, warum ich das so rechnen kann, denn eigentlich hast du ja schon recht, deine variante ist die haargenaue Umsetzung der Definition. Also durch das Modulo 11 schießt sich die 11 raus:Dookie hat geschrieben:ok, doch kein fehler, das selbe ist's aber nicht, nur rauskommen tut das gleiche
Hoffen wir mal, daß walker jetzt noch durchblickt.
Code: Alles auswählen
11 - ((10a +9b +8c +7d +6e +5f + 4g + 3h + 2i) % 11) % 11
== (11 % 11) - ((10a +9b + 8c +7d +6e +5f + 4g + 3h + 2i) % 11)
== 0 - ((10a + 9b + 8c +7d +6e +5f + 4g + 3h + 2i) % 11)
== (-10a - 9b -8c -7d -6e -5f -4g -3h -2i) % 11
Code: Alles auswählen
== ((-10 + 11)a + (-9+11)b + ... + (-2+11i)) % 11
== ((1a) + (2b) + ... (10i)) % 11
Ok!! Superdankeschön!!
Jetzt hab ich es auch so halbwegs verstanden nur hätte ich eine bitte, ob ihr mir das jetzt ohne erklärungen und ohne auseinanderrupfen noch mal aufschrieben könnt!
DANKE
Jetzt hab ich es auch so halbwegs verstanden nur hätte ich eine bitte, ob ihr mir das jetzt ohne erklärungen und ohne auseinanderrupfen noch mal aufschrieben könnt!
DANKE
Hi. Gut, kein Problem. Die Funktion hier holt aus einem String die ISBN raus (egal wie sie im Text steht, also unabhängig ob von "-" oder " " getrennte Nummern):
Es gibt bestimmt noch weitere 1000 Varianten, die zu bestimmen, aber um die haben Dookie und ich im Kern diskutiert.
Code: Alles auswählen
def get_isbn(isbn_text):
ziffern = "".join([a for a in isbn_text if a.isdigit()][:9])
psum=sum([(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
ziffern += "0123456789X"[psum]
return ziffern
Zuletzt geändert von Milan am Samstag 18. September 2004, 17:10, insgesamt 1-mal geändert.
Ich hab noch ne Frage und zwar schreibe ich das programm dann morgen zu 'Ende und wollte dann fragen wenn ich es fertig hab, ob es jemand von euch mal jemand durchgucken kann und mir dann dazu sagen kann ob es korrekt ist und so!!
@Milan:
Das letzte was du mir geschickt hast ist dann das korrekte oder?
DANKE ihr seid meine rettung
Das letzte was du mir geschickt hast ist dann das korrekte oder?
DANKE ihr seid meine rettung
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Der letzte von Milan gepostete Code, ist praktisch die Funktions zum rauspfriemeln der ISBN. Also das ganze in eine Funktion verpackt.
Jetzt kannst Du schreiben:
Natürlich muss dazu der Code von get_isbn auch im script stehen.
Gruß
Dookie
Jetzt kannst Du schreiben:
Code: Alles auswählen
pure_isbn = get_isbn("0-439-35806-X")
# oder
long_isbn = "0-439-35806-X"
pure_isbn = get_isbn(long_isbn)
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]