Suchen und Finden...aber wo?

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
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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 :(
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt halt den Index mitnehmen:

Code: Alles auswählen

suchMonat = filter(lambda (idx, x): i in x, enumerate(pfad_Split))
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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?
Zuletzt geändert von DMD am Dienstag 8. September 2015, 14:45, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

er sagt, dass idx undefiniert ist
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann vergleich nochmal die beiden Zeilen. Die unterscheiden sich um genau 2 Zeichen.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

du hast idx und enumirate eingefügt...
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

ich denke mal

Code: Alles auswählen

enumerate(pfad_Split)
muss so bleiben.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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!!!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann solltest du halt auch beide `i` aendern und nicht nur eines.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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()
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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 :)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Antworten