Grundrisse von Python!!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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 :wink: :D

Zu deinem kleinem Problem:

Code: Alles auswählen

isbn="3-342-65354-9"
isbn=isbn.replace("-","")
print isbn
mfg Milan
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Mach doch das Tutorial in der Python-Doku durch, da sind alle Grundlagen erklärt.

Tutorial

Gruss

*edit* warst eine minute schneller :)
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

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!!
rayo
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
Dookie
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:

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]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Dookie 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
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 exakt :wink:

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
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

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
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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 :wink: :

Code: Alles auswählen

psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
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 :wink: . Aber das sollte eigentlich alles im Tutorial zu finden sein, es ist quasi Handwerkszeug mit dem man in Python bequem arbeiten kann :D .
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

Also diesen Code den du mir zu letzt geschickt hast, soll ich dann in das Formular vorher einfügen oder?

Danke
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

So wäre das jetzt richtig oder:

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
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!
Dookie
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 ;)

Code: Alles auswählen

isbn = "0-8_15+4\\/7abc11"
ziffern=""
anz=0
Initialisierung, besser nehmen wir eine gültige ISBN

Code: Alles auswählen

isbn = "ISBN 0-8436-1072-7"
anzahl brauch ich bei meiner Versiondann nicht ;)

Code: Alles auswählen

for a in isbn:
    if a.isdigit() and anz<=9:
        ziffern+=a
        anz+=1
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.
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])
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.

Code: Alles auswählen

psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
Das ist jetzt ein Dicker Hund, der auch noch einen Fehler enthält.
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
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.

Code: Alles auswählen

ziffern+= (psum == 10) and "x" or str(psum)
hängt jetzt psum als Zeichen an ziffern an, wobei der fall 10 als "x" angehängt wird oder einfach psum als Nummer.
Ich würd das dann so machen:

Code: Alles auswählen

ziffern += "0123456789X"[psum]

Code: Alles auswählen

print ziffern
gibt dann die isbn ohne "-" aus.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Dookie hat geschrieben:

Code: Alles auswählen

psum=reduce(lambda a,b:a+b,[(i+1)*int(a) for (i,a) in enumerate(ziffern)]) % 11
Das ist jetzt ein Dicker Hund, der auch noch einen Fehler enthält.
*hehehe*... warum hab ich nur das Gefühl, zuviele Köche verderben den Brei :wink: ... 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 :wink: . Das war schon richtig so :lol: (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 :wink: . Ok, noch mal zusammengedrößelt:

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
mfg Milan
Zuletzt geändert von Milan am Samstag 18. September 2004, 15:02, insgesamt 1-mal geändert.
Dookie
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
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
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:

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
Und durch da wir immer noch Modulo 11 nehmen, ist es egal, mit dem wievielfachen vom 11 wir a bis i multiplizieren, hauptsache es bleibt derselbe Rest zwischen den Multiplikatoren:

Code: Alles auswählen

== ((-10 + 11)a +  (-9+11)b + ... + (-2+11i)) % 11
== ((1a) + (2b) + ... (10i)) % 11
Also ergibt sich haargenau dasselbe, nur finde ich lässt sich das leichter merken und rechnen. Da du den Rest ja schon erklärt hattest, hoffe ich nun mal wieder alle Klarheiten beseitigt zu haben :wink: . Ich glaube aber auch, so ein gut diskutiertes Beispiel ist ein guter Einstieg um mehrere Facetten einer Programmiersprache zu lernen :wink: (*puh* - gerade noch den Bogen bekommen :lol: )
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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):

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
Es gibt bestimmt noch weitere 1000 Varianten, die zu bestimmen, aber um die haben Dookie und ich im Kern diskutiert.
Zuletzt geändert von Milan am Samstag 18. September 2004, 17:10, insgesamt 1-mal geändert.
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

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!!
Walker26
User
Beiträge: 10
Registriert: Samstag 18. September 2004, 08:34
Kontaktdaten:

@Milan:

Das letzte was du mir geschickt hast ist dann das korrekte oder?

DANKE ihr seid meine rettung
Dookie
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:

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)
Natürlich muss dazu der Code von get_isbn auch im script stehen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten