Seite 1 von 1

Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 05:20
von DMD
ich nochmal mit einem neuen problem:
ich hab einen code gebastelt, der pfad_Split nach den einzelnen monatsnamen durchsucht.

Code: Alles auswählen

import datetime

pfad_Split = [u'A', u'B', u'C', u'D', u'E', u'F', u'G', u'January 2015', u'H']

#Monatsnamen erstellen -------------------------------------------------------------------
months_choices = []
for i in range(1,13):
    months_choices.append((datetime.date(2008, i, 1).strftime('%B')))

#Suche in pfad_Split ------------------------------------------------------------------------
counter = 0
for i in months_choices:
    suchMonat = filter(lambda x: i in x, pfad_Split)
    if len(suchMonat) != 0:
        counter += 1
        print suchMonat
        print counter
jetzt möchte ich aber, dass mir der code zusätzlich noch ausspuckt, an welcher stelle in pfad_Split er den string 'January' gefunden hat,
heisst der soll mir counter = 8 geben.
macht er aber net. weiss jmd wie?
ps. die suche einfach umzudrehen funktioniert nicht, da er dann January nicht findet, weil die 2015 noch dahintersteht :(

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 06:34
von Sirius3
Du mußt halt den Index mitnehmen:

Code: Alles auswählen

suchMonat = filter(lambda (idx, x): i in x, enumerate(pfad_Split))

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 14:43
von DMD
war ja klar:

Code: Alles auswählen

position = []
for i in months_choices:
    suchMonat = filter(lambda (idx, x): i in x, enumerate(pfad_Split))
    if len(suchMonat) != 0:
        position.append(idx)
        print suchMonat
        print position
das was mich interessiert ist die position der zahl.
kann ich die zahl und monatsname auch in voneinander getrennten listen angeben?

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 14:44
von Sirius3
@DMD: funktioniert nicht, ist eine äußerst schlechte Fehlerbeschreibung. Was passiert? Gibt es eine Fehlermeldung? Wie ist das erwartete Verhalten und wie das tatsächliche?

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 14:46
von DMD
er sagt, dass idx undefiniert ist

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 14:50
von BlackJack
@DMD: Ist es an der Stelle ja auch. Das ist ein Argument der anonymen Funktion die mit dem ``lambda``-Ausdruck erstellt wird und nur innerhalb dieser Funktion sichtbar/bekannt. Was enthält denn `suchMonat` für Werte? Schau Dir das doch mal an.

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 14:51
von cofi
Dann vergleich nochmal die beiden Zeilen. Die unterscheiden sich um genau 2 Zeichen.

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:00
von DMD
du hast idx und enumirate eingefügt...

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:01
von DMD
ich denke mal

Code: Alles auswählen

enumerate(pfad_Split)
muss so bleiben.

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:04
von DMD

Code: Alles auswählen

position = []
for i in months_choices:
    suchMonat = filter(lambda (idx, x): i in x, enumerate(pfad_Split))
    if len(suchMonat) != 0:
        position.append(i)
        print suchMonat
        print position
...aber i will ich ja nicht, sondern idx!!!

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:08
von cofi
Dann solltest du halt auch beide `i` aendern und nicht nur eines.

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:39
von DMD
also bevors es peinlich wird:
es sind insgesamt drei i`s im code.
das i in "for i in months_choices:" ist korrekt,
das i in "(i, x)" habe ich in "(idx, x)" geändert,
bleiben noch
"i in x, enumerate(pfad_Split))" und
"position.append(i)".
davon darf ich aber doch keins ändern, wenn dann nur beide!
ich soll aber nur eins ändern...
ERROR

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:42
von cofi
Das `idx` das _jetzt_ den NameError verursacht (Zeile 5 im Fragment) gibt es ueberhaupt nicht, da es nur innerhalb des lambda existiert. Du kannst darauf nicht zugreifen egal wie du es nennst.

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 15:47
von snafu
Mein Vorschlag unter Zuhilfenahme des `calendar`-Moduls:

Code: Alles auswählen

import calendar

def get_month_name_matches(strings):
    month_names = calendar.month_name[1:]
    for i, s in enumerate(strings):
        for month_name in month_names:
            if month_name in s:
                yield i, month_name

def print_month_name_matches(strings):
    for i, month_name in get_month_name_matches(strings):
        msg = 'Found month name {!r} at index #{}'
        print(msg.format(month_name, i))

def main():
    strings = [u'A', u'B', u'C', u'D', u'E', u'F', u'G', u'January 2015', u'H']
    print_month_name_matches(strings)


if __name__ == '__main__':
    main()

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 16:18
von DMD
danke snafu,
ich versuche das mal in meinen code ein/umzubauen.
in meinem muss is also schon bei

Code: Alles auswählen

months_choices = []
for i in range(1,13):
    months_choices.append((datetime.date(2008, i, 1).strftime('%B')))
die position und den monatsnamen mitnehmen, würd ich sagen.,
mal sehen, danke an alle die mir geholfen haben :)

Re: Suchen und Finden...aber wo?

Verfasst: Dienstag 8. September 2015, 23:03
von snafu
@DMD: Das `calendar`-Modul gehört zur Standardbibliothek, d.h. auch du könntest es in deinem installierten Python importieren und verwenden. Sofern du kein tatsächliches Datum benötigst, sondern wirklich nur an die Monatsnamen willst, dann würde ich dir die Verwendung des Moduls sogar empfehlen.

Re: Suchen und Finden...aber wo?

Verfasst: Mittwoch 9. September 2015, 07:48
von Sirius3
@DMD: Programmieren ist nicht wild herumraten, sondern ein Problem so lange in kleinere Teile herunterbrechen und diese konstruktiv wieder zusammenzusetzen, bis man eine Lösung gefunden hat. Deine erste Teillösung ist, gehe alle Monate in einer for-Schleife durch. Der zweite Teil ist, für jeden Monat durchsuche den Pfad nach diesem Monat:

Code: Alles auswählen

for i in months_choices:
    suchMonat = filter(lambda (idx, x): i in x, enumerate(pfad_Split))
    if len(suchMonat) != 0:
        print suchMonat
Das heißt also, in suchMonat ist jetzt eine Teillösung gespeichert. Die Frage ist, was fehlt Dir jetzt noch?