while bis Methode find kein Ergebnis mehr liefert

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.
Antworten
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

Hallo zusammen,
ich bin noch blutiger Anfänger und hoffe nicht gleich einen Fauxpas zu landen.
hier meine Frage: Also ich habe mir überlegt, die Positionen eines Buchstaben aus einem String so oft ausgeben zu lassen, wie er denn auch darin vorkommt. Das ganze habe ich über die Methode find realisieren wollen und nun hänge ich daran, dass ich nicht so wirklich weiß, wie ich innerhalb der Schleife, bis zum nächsten Vorkommen des Buchstabens komme. hier mal mein Code

Code: Alles auswählen

s = "www.bonanza.de"
slen = len(s)
c = "n"

while slen != 0:
    if s.find(c):
        res = s.find(c)
        print res
        slen = slen -1    
Meine Idee ist, dass ich immer wieder den Teil vom Anfang bis zum Vorkommen des Buchstabens abschneide und innerhalb der übrig gebliebenen Buchstaben danach suche. Ja, wie gesagt, das ist meine Idee, allerdings fehlt mir jegliche Idee zur Umsetzung. Wäre für jeden Tipp dankbar, auch wenn's negativ Kritik ist, oder mein Vorhaben schlichtweg dämlich ist, lasst es mich wissen

Gruß Oblivion
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo oblivion,
wie wäre es mit:

Code: Alles auswählen

s.count(c)
Gruß Whitie
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

oh vielleicht habe ich mich falsch ausgedrückt, ich möchte nicht die Anzahl ausgeben lassen, sondern die jeweiligen Positionen
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Eine schnell zusammengesetzte Lösung, für den Lerneffekt:

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8

def count_chars(string):
    chars = {}

    for s in string:
        if s in chars.keys():
            chars[s] += 1
        else:
            chars[s] = 1

    return chars
Die Schleife geht einmal durch den ganzen String und schaut sich jedes einzelne Zeichen an. chars ist ein Dictionary, in dem zu jedem Zeichen die Anzahl der Vorkommen vermerkt ist. Alle Zeichen, die in Chars nicht vorkommen, kommen auch im String nicht vor. Groß- und Kleinschreibung wird unterschieden.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Code: Alles auswählen

In [11]: [pos for pos, i in enumerate("bla") if "l" == i]
Out[11]: [1]

In [12]: [pos for pos, i in enumerate("blalala") if "l" == i]
Out[12]: [1, 3, 5]
Keine Ahnung. Vielleicht so?
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Oh sorry,
ich sehe gerade, dass ich nicht richtig gelesen habe.

Vielleicht so:

Code: Alles auswählen

s='www.bonanza.de'
index = 0
c='n'

for char in s:
  if char == c:
    print index
  index += 1
Gruß Whitie
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

oblivion hat geschrieben:oh vielleicht habe ich mich falsch ausgedrückt, ich möchte nicht die Anzahl ausgeben lassen, sondern die jeweiligen Positionen
Ok, auch falsch verstanden. Besser?

Code: Alles auswählen


string="Irgendein String"
gesucht="e"

for i in xrange(len(string)):
    if string[i] == gesucht:
        print i
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

ja, das ist wohl genau das was ich erreichen wollte, allerdings mit der methode find. Ist das denn überhaupt so ohne weiteres Möglich, ohne von Hinten in's Knie und zum Kopf wieder raus zu müssen?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

s = "www.bonanza.de"
c = "n"

while True:
    res = s.find(c)
    if res == -1:
        break
    print res
    s = s[res+1:] 
so ginge das :]
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

vielen Dank für die Hilfen, audax, leider hat Deine Lösung nur das erste Ergebnis richtig zum Vorschein gebracht, das zweite ist leider falsch
6
1
Aber die Lösungen haben mich auf jeden Fall weiter gebracht.

Was ich nur nicht verstehe, mit xrange(len(string))
bewege ich mich doch innerhalb eines Bereichs, der in diesem Fall die Länge des Strings string ist, wieso wird bei der Iteration durch Zahlen, die richtige Position der Buchstaben angezeigt?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

s = "www.bonanza.de"
c = "n"
index = 0

while True:
    res = s.find(c)
    if res == -1:
        break
    print res + index
    index += res
    s = s[res+1:] 
...
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

wow, ihr seit ja echt der Hammer hier! Audax, leider ist die Ausgabe des 2en Vorkommen immer noch falsch
6
7
Aber trotzdem vielen Dank für Dein Bemühen!
BlackJack

Wobei es effizienter wäre nicht die Zeichenkette zu "zerkleinern" sondern mit dem zweiten Argument von `str.find()` zu arbeiten.

Ansonsten würde ich aber auch zu einer Lösung mit "list comprehension" oder Generator-Ausdruck und `enumerate()` tendieren. Oder zumindest `index()` statt `find()` verwenden.
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

Ich werde Deinen Rat beherzigen. Mittlerweile kann ich mir die Frage bezüglich xrange auch selbst beantworten, zumindest glaube ich das. Es scheint keine Rolle zu spielen, ob ich die Elemente eines Strings als Liste anspreche. ich habe noch ein wenig Probleme mit den immutable und mutable Objekten und den Instanzen, die sich darauf beziehen. Ich danke Euch allen für Eure Hilfe
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

s = "www.bonanza.de"
c = "n"
index = 0

while True:
    res = s.find(c)
    if res == -1:
        break
    print res + index
    index += res+1
    s = s[res+1:] 
oder mal so, wie es sein sollte:

Code: Alles auswählen

s = "www.bonanza.de"
char = "n"

for i, c in enumerate(s):
    if c == char:
        print i
Antworten