string-Werte aus dictionary auslesen

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
Kingkuddl
User
Beiträge: 5
Registriert: Freitag 23. Juni 2006, 15:20

Freitag 23. Juni 2006, 15:30

Hallo, ich habe mal 2 Fragen:
1. Ich habe ein dictionary in dem alle Werte strings sind. Jetzt möchte ich diese werte nach einem string durchsuchen und er soll mir die keys zurückgeben in denen der suchstring komplett enthalten ist. Wie kann ich das am schnellsten lösen?
2. Die zurückgegebenen keys sollen dann in integer-variablen umgewandelt werden(ausserhalb des dictionaries, aber mit unverändertem Namen). Funktioniert das irgendwie?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Freitag 23. Juni 2006, 16:01

zu erstens: dafür solltest du sql brauchen, abfsragen nach dem key sind ja etwas komplexer und werden (glaucbe ich) nicht unterstützt.
zu zweitens: ganz einfach mit int()

Code: Alles auswählen

mystring = "56"
print int(mystring)
du müsstest dann damit nur die variable überschreiben, wenn der name gleich bleiben soll!

Code: Alles auswählen

myvar_1 = "56"
myvar_1 = int(myvar_1)
Kingkuddl
User
Beiträge: 5
Registriert: Freitag 23. Juni 2006, 15:20

Freitag 23. Juni 2006, 16:41

hm, wenn das so kompliziert ist überleg ich mir vielleicht nen anderen weg. ich will nämlich verschiedene dateien und deren namen einlesen, dann versch. suchstrings durch diese dateien jagen und die dateinamen zurückgeben in denen die strings jeweils sind. (kurz gesagt ich will wissen in welchen dateien die strings sind :) ) geht das auch einfacher als mit sql, das kann ich nämlich nicht
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Freitag 23. Juni 2006, 19:20

Hier kommt mal ein unsauberes Konstrukt zu der Dictionary-Sache, nur über die Shell getestet

Code: Alles auswählen

myDict = {'1':'Ein','2':'anderer','3':'String'}
searchString = 'anderer'

def toInt(aString):
    try:
        myInt = int(aString)
    except ValueError:       #Wird ausgelöst, wenn was anderes als eine Zahl im String ist!
        myInt = None
    return myInt

#Iterator für das Dictionary
it = myDict.iteritems()
while not StopIteration:
    dummy=it.next()  #dummy ist ein Tuple, [0] ist der key, [1] der Wert aus dem Dictionary
    if dummy[1] == searchString:
        print toInt(dummy[0])  
Und sql würde dir nur helfen, wenn du die Daten in einer Datenbank hast.

mfg, querdenker

PS: FEIERABEND UND WOCHENENDE!!!!! :D:D:D:D:D:D
Benutzeravatar
newone_XXV.
User
Beiträge: 50
Registriert: Dienstag 20. Juni 2006, 15:03
Wohnort: Direkt vor meinem PC
Kontaktdaten:

Freitag 23. Juni 2006, 20:03

Ichweiß zwar nicht ob Du so etwas meinst (ist bei mir entstanden als ich angefangen habe ein Adressbuch zu schreiben....):

Code: Alles auswählen

    elif option == 2:
        such_name = raw_input('Geben Sie den Namen ein den Sie im Adressbuch suchen wollen: ')
        if gespeicherteliste.has_key(such_name):
            print gespeicherteliste[such_name]
        else:
            print 'Name nicht im Adressbuch!'
Bei mir hat diese Technik sehr gut funktioniert.... Warum ich den Rest nicht poste: Wurde generalüberholt.... :wink: Nein habe letztendlich aus diesen Gründen entschlossen das hübsch in Klassen und Listen zu unterteilen: http://www.python-forum.de/topic-6310.html

Mal eine Frage zu SQL wann sollte man das eigentlich lernen? Also bei welchen Arbeiten bietet es sich gut an SQL zu nutzen?
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Freitag 23. Juni 2006, 20:59

newone_XXV hat geschrieben:Mal eine Frage zu SQL wann sollte man das eigentlich lernen? Also bei welchen Arbeiten bietet es sich gut an SQL zu nutzen?
Wann immer du direkt in einer DB arbeiten musst / kannst / sollst. Und außerdem brauchst du es, wenn du z.B über Python Abragen an eine DB stellst.
Hier zum Beispiel mal ein Link in die Dokumentation von kinterbasdb, der Python-"Schittstelle" zu Interbase / Firebird-Datenbanken : GO

Manchmal gibt es Dinge in einer Datenbank zu erledigen, für die es sich nicht lohnt, ein Programm zu schreiben. Da öffnet man einen SQL-Prompt, gibt ein paar Statements ab und gut ist.

mfg, querdenker
Benutzeravatar
newone_XXV.
User
Beiträge: 50
Registriert: Dienstag 20. Juni 2006, 15:03
Wohnort: Direkt vor meinem PC
Kontaktdaten:

Freitag 23. Juni 2006, 21:24

Achso... Dann werde ich mir das wohl auch noch aneignen müssen.... :? Also: Ab zu meinen besten Freunden im Netz: Mister Google & Co.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 23. Juni 2006, 22:20

newone_XXV. hat geschrieben:Mal eine Frage zu SQL wann sollte man das eigentlich lernen? Also bei welchen Arbeiten bietet es sich gut an SQL zu nutzen?
Hi newone_XXV.!

Man denkt am Anfang eines Programmprojektes manchmal gar nicht daran, welche Fragen später einmal auftauchen könnten. Wenn du deine Daten in einer durchdacht strukturierten Datenbank ablegst, kanst du die Fragen an die du heute noch gar nicht denkst, später trotzdem ziemlich sicher beantworten.

Du kannst deine Daten in Beziehung zueinander setzen. Du kannst oft benötigte Suchvorgänge durch gezielt angewendete Indexe beschleunigen.

Nehmen wir mal an, du verwaltest Adressen in Textdateien, die du in einem Ordner ablegst. Die Textdateien haben eindeutige Namen, die du aus dem Schema "nachname_vorname_zaehler.txt" gebildet hast. Es ist ziemlich einfach für dich, eine Adresse raus zu suchen, solange du den Nachnamen und evt. auch den Vornamen weißt.

Was aber ist, wenn du nur weißt, dass die Person die du suchst, im Vornamen "Franz" heißt und in der "Müllerstraße" wohnt? Du müsstest dir alle Textdateien öffnen und ansehen, die als Vornamen im Dateinamen den Text "franz" haben. Nehmen wir mal an, du hast alle Adressen der Stadt Berlin nach diesem Schema in Textdateien. Auch wenn du ein kleines Python-Programm schreibst, das dir die Textdateien öffnet und nachsieht, ob dort irgendwo "Müllerstraße" steht, wird das Programm ziemlich langsam sein.

Du könntest dir die wichtigsten Daten, nach denen du häufig suchst, in eine oder mehrere Textdateien schreiben und dich darum kümmern, dass dort die Suchworte alphabetisch sortiert drinnen stehen und mit einem Verweis zur Textdatei, in der die Adresse steht, versehen sind. Dann hättest du einen Index, der deine Suche beschleunigt.

Allerdings müsstest du dich auch wieder selber darum kümmern, dass diese Indexe ständig aktuell gehalten werden. Außerdem stört es dich, dass du jede Suche "programmieren" musst. Dann entwickelst du eine einfache Syntax für deine Suchanfrage. --> Fertig ist deine kleine Datenbank. Ziemlich viel Aufwand für etwas, was zum Basis-Funktionsumfang heutiger relationaler Datenbanken gehört. Hättest du also schon ganz am Anfang, als du noch nicht wusstest, wie groß dein Programm wird, auf eine SQL-Datenbank gesetzt, dann hättest du dich nie um das alles kümmern müssen.

Um deine Adressen in einer Datenbank ablegen zu könnten, hättest du nur eine "Tabelle" für die Adressen anlegen müssen. Beim Erstellen einer solchen Tabelle, gibtst du auch gleichzeitig mit an, welche Daten du in der Tabelle verwalten möchtest. Z.B. "vorname", "nachname", "strasse", "hausnummer", "stiege", "stockwerk", "top", "plz", "ort", usw.

Die Tabelle, die dabei entsteht, verwaltet deine Daten strukturiert. Jede Adresse steht dann in einer Zeile und die Orte stehen alle in einer Spalte untereinander. Die Vornamen auch -- usw. Dadurch ist es auch einfacher, diese Daten gezielt wieder aus der Tabelle heraus zu suchen.

Die ganze Datenbank mit ihren Daten kannst du mit der einfach gehaltenen Anweisungssprache SQL (Structured Query Language) aufbauen, mit Daten befüllen, Daten löschen und suchen.

Das Erstellen einer Tabelle, könnte so aussehen:

Code: Alles auswählen

CREATE TABLE adressen (
    id INTEGER PRIMARY KEY, # kennzeichnet jede Adresse mit einer eindeutigen Zahl
    vorname VARCHAR(50),
    nachname VARCHAR(50),
    ...
)
Das Befüllen der Adressen-Tabelle könnte so aussehen:

Code: Alles auswählen

INSERT INTO adressen (
    vorname,
    nachname,
    strasse,
    ...
)
VALUES (
    'Gerold',
    'Penz',
    'Pfarrer-Leuprech-Weg',
    ...
)
Um alle Personen mit dem Nachname Franz, die in der Müllerstraße leben, mit einer SQL-Abfrage heraus zu bekommten, könnte diese in etwa so aussenen:

Code: Alles auswählen

SELECT
  vorname, nachname, strasse
FROM
  adressen
WHERE
  (vorname = 'Franz') AND
  (strasse = 'Müllerstraße')
Das waren so die wichtigsten SQL-Anweisungen. So schwer ist SQL also auch wieder nicht. Hier noch auf "Deutsch": Zeige mir die Felder "vorname", "nachname" und "strasse", der "Tabelle" "adressen", in denen der Vorname "Franz" ist und in denen gleichzeitig als Straße "Müllerstraße" steht.

Du bekommst in Python normalerweise bei solchen Abfragen eine Liste zurück. In dieser Liste ist dann je ein Tuppel für eine Adresse.

Code: Alles auswählen

ergebnis = [
    ("Franz", "Meier", "Müllerstraße"),
    ("Franz", "Mustermeier", "Müllerstraße"),
]
Dieses Ergebnis lässt sich dann leicht weiterverarbeiten.

Fazit: Eine Datenbank erleichtert dein Leben als Programmierer enorm. Auch wenn es verlockend erscheint, Daten in einem Dictionary oder einem "shelve"-Objekt zu verwalten. Sobald man Daten nicht nur über einen Schlüssel (wie z.B. einem Dateinamen oder einem Dictionary-Key) wieder finden möchte, sollte man sich überlegen, die Daten in einer Datenbank aufzubewahren. Als Python-Programmierer möchte ich dir dafür ganz besonders SQLite ans Herz legen, da SQLite ab Python 2.5 schon von Haus aus mitgeliefert wird. Es ist ziemlich stabil und "sauschnell". :-)

Siehe auch in diesem Beitrag (weiter unten): http://www.python-forum.de/topic-6157.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten