Seite 1 von 2
palindrome
Verfasst: Donnerstag 9. November 2006, 10:59
von cyp++
hi
ich habe ein kleines problem.
Code: Alles auswählen
inp = raw_input('Palindrompruefung: ')
t = inp.upper()
k = ''
i = 0
while i < len(inp):
if t[i] >= 'A' and t[i] <= 'Z' or t[i] >= 'a' and t[i] <= 'z':
k += inp[i]
i += 1
l = k.lower()
print l
d = len(l)
for i in range(d+1):
if l[i] == l[-(i+1)]:
print 'k'
else:
print 'nicht k'
es gahr darum, zu prüfen, ob es sich bei der eingabe um ein palindrom handelt. bitte beachtet den ersten abschnitt nicht, ich habe einfach drauf los getippt und es funktioniert, doch der 2. teil funzt nicht ganz! ich bekom immer einen IndexError: String Index out of range in zeile 15
was ist falsch daran?
mfg
Verfasst: Donnerstag 9. November 2006, 11:21
von sape
so geht es.
Code: Alles auswählen
for i in range(len(l)): # <------- das +1 weggemacht, damit es nicht zum Index Error kommt. Der ganze Code von dir scheint zu funtzen! :)
if l[i] == l[-(i+1)]: # <------- zeile 15
print l[i]
else:
print 'nicht k'
Der Fehler ligt daran das du oberhalb der Lenge von l iterierst und es so zu eine index error kommt

Sprich: Der letzte index ist nicht mehr in list l vorhanden und daher der Fehler.
EDIT: Aber mal so nebenbei, was sol der untere teil machen? Wenn ich otto eingebe wird mir otto angezeigt. wenn ich aber ottos (^^) eingebe wird mir nur ein t angezeigt
EDIT2: Ok ich hatte die else vergessen zu kopieren ^^ Wird aber dadurch auch nicht logischer für mich. wenn ein Zeichen doppelt ist, wird if ausgeführt ansonsten else. In wie fern sol das dazu beitragen um zu testen, ob das Wort ein Palindrom ist
EDIT3: Ok, nun hab ichs verstanden wie das funktioniert ^^ Coole Sache!
EDIT4:
cyp++ hat geschrieben:ja es ist noch nicht ganz fertig, wenn überall 'k' steht ist es ein palindrom! ich muss die ausgabe noch bissl abändern!
Jepp, hab ich auch gerade gemerkt. Der Code ist aber ein wenig schwer zu lesen Funktioniert bei mir aber 100% (habs mit otto ausprobiert). Werde den code noch ein wenig studieren ^^
Verfasst: Donnerstag 9. November 2006, 11:30
von cyp++
ja es ist noch nicht ganz fertig, wenn überall 'k' steht ist es ein palindrom! ich muss die ausgabe noch bissl abändern!
Verfasst: Donnerstag 9. November 2006, 11:36
von sape
OK, die while schleife würde ich weg machen und stattdessen mit einer for schleife über inp iterieren

Ist Pythonischer. schließlich sind wir ja hier nicht bei C/C++ ^^
EDIT: Nicht d+1. Ist der gleiche Fehler wie vorhin der einen Index Error auslöst!
Verfasst: Donnerstag 9. November 2006, 11:50
von sape
Hier mal der aufgeräumte Code.
Code: Alles auswählen
inp = 'otToS' # raw_input('Palindrompruefung: ')
k = ''
for i in inp:
if i >= 'A' and i <= 'Z' or i >= 'a' and i <= 'z':
k += i
l = k.lower()
print l
for i in range(len(l)):
if l[i] == l[-(i+1)]:
print "l:", l[i]
else:
print "nicht k"
Verfasst: Donnerstag 9. November 2006, 12:08
von sape
So und hier die Finale Version.
Code: Alles auswählen
inp = 'Madam' # raw_input('Palindrompruefung: ')
k = ''
for i in inp:
if i >= 'A' and i <= 'Z' or i >= 'a' and i <= 'z':
k += i
k = k.lower()
for i in range(len(k)):
if k[i] == k[-(i+1)]:
print k[i]
else:
print "Das Wort %s ist kein Palindrome" %k
break
Verfasst: Donnerstag 9. November 2006, 12:28
von CM
Code: Alles auswählen
k=k.lower()
if k == k[::-1]:
print "Ist ein Palindrom"
else:
print "Ist kein Palindrom"
Verfasst: Donnerstag 9. November 2006, 13:27
von BlackJack
Fast. Du filterst keine nicht-Buchstaben.
Code: Alles auswählen
def is_palindrom(s):
s = [c.lower() for c in s if c.isalpha()]
return s == s[::-1]
print is_palindrom('Satan, oscillate my metallic sonatas!')
Verfasst: Donnerstag 9. November 2006, 13:35
von sape
Hmm, interessant. Das heißt k[::-1] macht ein Reverse. Wuste ich ja noch gar nicht
Hab auch noch einen ^^

:
Code: Alles auswählen
import re
def isPalindrome(string):
if len( re.findall("([^a-z-A-Z])", string)):
print "Fehler der String %s enthaelt andere Zeichen ausser a-z oder A-Z!" %string
return False
else:
string=string.lower()
if string == string[::-1]:
print "%s ist ein Palindrom" %string
return True
else:
print "%s ist kein Palindrom" %string
return False
isPalindrome("hallo456")
isPalindrome("test%&/")
isPalindrome("otto")
isPalindrome("oTTO")
isPalindrome("madam")
isPalindrome("Hallo")
EDIT:BlackJack wahr mal wider schneller ^^ BTW: Bis her ist seine Variante am besten ^^
Verfasst: Donnerstag 9. November 2006, 13:38
von sape
Verfasst: Donnerstag 9. November 2006, 14:01
von CM
@BlackJack: Das ist nur eine Kontext-Frage. Palindrom ist schließlich nicht Palindrom. In der engsten Definition liefern meine Zeilen die korrekte Antwort, wenn man den Begriff weiter fast, dann natürlich nicht.
Noch ein Goodie:
Für DNA habe ich noch folgende Version (hierbei ist self eine Instanz der DNA-Klasse und dieser scheinbare Aufwand, den ich treibe tatsächlich die beste Lösung, nämlich dann, wenn man mehr als vier komplementäre Basen - aus einem best. Grund habe ich eine ungerade Anzahl von Basen als nicht palindromisch einsortiert):
Code: Alles auswählen
def check_palindromic(self):
s = self.seq
if (len(s)%2) == 0 and s[len(s)/2:] == DNA(s[:len(s)/2]).reversecomplement():
return True
else: return False
Gruß,
Christian
Verfasst: Donnerstag 9. November 2006, 14:04
von sape
BlackJack hat geschrieben:Fast. Du filterst keine nicht-Buchstaben.
Code: Alles auswählen
def is_palindrom(s):
s = [c.lower() for c in s if c.isalpha()]
return s == s[::-1]
print is_palindrom('Satan, oscillate my metallic sonatas!')
funktioniert nicht da auch bei && oder5555 oder sonstwas ein True zurückgegeben wird.
Verfasst: Donnerstag 9. November 2006, 14:10
von sape
So gehts:
Code: Alles auswählen
def is_palindrom(s):
s = [c.lower() for c in s if c.isalpha()]
return s == s[::-1] and len(s) != 0
print is_palindrom("9%$")
print is_palindrom("otto")
Verfasst: Donnerstag 9. November 2006, 15:16
von BlackJack
CM hat geschrieben:@BlackJack: Das ist nur eine Kontext-Frage. Palindrom ist schließlich nicht Palindrom. In der engsten Definition liefern meine Zeilen die korrekte Antwort, wenn man den Begriff weiter fast, dann natürlich nicht.
Schon klar. Als Kontext bin ich davon ausgegangen es soll dass tun was das Programm von cyp++ auch macht.
Verfasst: Donnerstag 9. November 2006, 17:57
von cyp++
danke für all eure hilfen!

hier mal mein endergebnis:
Code: Alles auswählen
# eingabe durch den user
eingabe = raw_input('Palindrompruefung: ')
# umwandlung in grossbuchstaben
eingabe_gross = eingabe.upper()
k = ''
# schleifen-zaehler
i = 0
# zeichen-zaehler
zaehler = 0
# start des programms
while i < len(eingabe):
# wenn zeichen nicht innerhalb von A-Z oder a-z, raus damit!
if eingabe_gross[i] >= 'A' and eingabe_gross[i] <= 'Z' or eingabe_gross[i] >= 'a' and eingabe_gross[i] <= 'z':
k += eingabe[i]
i += 1
# umwandlung in kleinbuchstaben
eingabe_klein = k.lower()
# ermittlung der laenge von l
d = len(eingabe_klein)
for i in range(d):
# wenn i-tes zeichen gleich -(i-tes-zeichen + 1)...
if eingabe_klein[i] == eingabe_klein[-(i+1)]:
# ... addiere 1 zum zaehler
zaehler += 1
# wenn zaehler der anzahl der zeichen des eingebenen strings entspricht, handelt es sich um ein palindrom!
if zaehler == len(eingabe_klein):
print '\n',eingabe_klein, 'ist ein Palindrom.'
# wenn nicht, ist es kein palindrom!
else:
print '\n',eingabe_klein, 'ist kein Palindrom.'
gibts noch verbesserungsvorschläge?
Verfasst: Donnerstag 9. November 2006, 18:19
von CM
cyp++ hat geschrieben:
gibts noch verbesserungsvorschläge?
Na ja, will ja nicht so direkt fragen ... aber hast Du Dir mal die anderen Posts angeschaut?
Gruß,
Christian
Verfasst: Donnerstag 9. November 2006, 18:22
von sape
cyp++ hat geschrieben:[...]
gibts noch verbesserungsvorschläge?
Ja ^^
Code: Alles auswählen
def is_palindrom(s):
s = [c.lower() for c in s if c.isalpha()]
return s == s[::-1] and len(s) != 0
# Test
print is_palindrom("9%$")
print is_palindrom("otto")
Dein Code ist zu lang und zu unpythonic. Dein Code erinnert an C/C++. Du kommst nicht zufällig aus der C/C++ ecke?
Verfasst: Donnerstag 9. November 2006, 21:48
von BlackJack
Hm ich würde das noch ein klein wenig ändern, IMHO erfüllt eine leere Zeichenkette auch die Palindrom-Eigenschaft:
Code: Alles auswählen
def is_palindrom(s):
if not s:
return True
s = [c.lower() for c in s if c.isalpha()]
return s and s == s[::-1]
Verfasst: Freitag 10. November 2006, 14:54
von cyp++
CM hat geschrieben:cyp++ hat geschrieben:
gibts noch verbesserungsvorschläge?
Na ja, will ja nicht so direkt fragen ... aber hast Du Dir mal die anderen Posts angeschaut?
Gruß,
Christian
vll weißt du es nicht, aber ich bin anfänger 11. klasse ausbildung zum tai. das hatten wir noch alles gar nicht!
Verfasst: Freitag 10. November 2006, 15:19
von sape
BlackJack hat geschrieben:Hm ich würde das noch ein klein wenig ändern, IMHO erfüllt eine leere Zeichenkette auch die Palindrom-Eigenschaft:
Code: Alles auswählen
def is_palindrom(s):
if not s:
return True
s = [c.lower() for c in s if c.isalpha()]
return s and s == s[::-1]
OK, aber nicht im sinne von einem Wort/Begriff. Otto ist ein Palindrom aber ein Leerzeichen ist einfach nichts und mMn wäre es verkehrt dann ein True zurückzugeben. Aber in weitesten Sinne magst du wohl rech haben, wie auch CM mit seinen Code.
Code: Alles auswählen
k=k.lower()
if k == k[::-1]:
print "Ist ein Palindrom"
else:
print "Ist kein Palindrom"
Aber danach wurde ja nicht gefragt. Die Anforderung beschränkte sich ja nur auf Begriffe und nicht auf Leerzeichen oder (wie in CMs Beispiel) auf Alle Chars.
lg
EDIT:
@cyp++:
Dabei fällt mir die regel 1 vom Zen ein: Schön ist besser als hässlich.
und die regel 3: Einfach ist besser als komplex.
EDIT2: Im ersten Edit das @cyp++ vergessen.