merkwürdige for - Schleife

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nun sehe ich auch, worauf BlackJack mit den Dictionaries hinaus wollte. Haben Placebos mit dem selben Namen immer den selben Wert? Wenn ja, dann solltest du das entweder über ein Dictionary lösen oder aber die Elemente per Referenz in der Liste speichern:

Code: Alles auswählen

ars = 'ars', 2
natm = 'nat-m', 2

'Asthma' : [ars, natm, ...]
Sonst bekommst du Probleme mit der Konsistenz der Daten. Denn ändert sich der Wert, dann müsstest du dies an jeder Stelle machen. Mit einem Dictionary oder Referenzen hättest du das Problem nicht.
Das Leben ist wie ein Tennisball.
BlackJack

@Eliazz: Ah, ich hatte übersehen dass die Mittel *nicht* in einer eigenen Liste stehen. Das wäre auch noch so ein Punkt: In eine Liste sollte man nur Objekte vom gleichen „Typ”, also solche mit der gleichen Bedeutung stecken.

Verschachtelte Wörterbücher sind nicht komplizierter als die Listen jetzt. Eher weniger kompliziert weil es regelmässiger ist als eine Liste bei der das erste Element eine andere Bedeutung hat als die restlichen Elemente.

Falls sich das „selber schreiben” auf eigene Datentypen bezieht: Datentyp und Klasse kann man in Python synonym verwenden. Sich eigene Datentypen schreiben bedeutet also Klassen schreiben.

@EyDu: Verschachtelte Wörterbücher hatte ich auch vorgeschlagen. Wäre wohl sogar mein Favorit, weil der Code dafür soweit ich das überblicke einfacher würde.

Die Wertigkeit ist nicht immer gleich — sieht man leicht an 'ars' was offenbar gegen alles hilft und immer das erste Element in den Listen ist, und das die Wertigkeitslisten nicht alle mit dem gleichen Wert anfangen.
BlackJack

Noch mal eine Lösung von mir. Ich hoffe ich habe das mit dem addieren der Wertigkeit richtig gemacht. Ende der Eingabe ist eine einfache Leereingabe, also nur Enter.

Code: Alles auswählen

from functools import partial, reduce
#: 
#: Mapping of symptom to a mapping of placebo to value.
#: 
SYMPTOM_TO_PLACEBOS = {
    'Abmagerung': {'ars': 3, 'lyc': 2, 'merc': 2, 'nat-m': 1},
    'Asthma': {'ars': 2, 'lyc': 2, 'nat-m': 2, 'phos': 3},
    'Hitze': {
        'ars': 1, 'bell': 3, 'nat-m': 2, 'puls': 2, 'sulf': 3, 'sulf-ac': 2
    },
    'Kälte': {'ars': 3, 'lyc': 1, 'merc': 2, 'sil': 3},
}


def add_common_placebos(placebos_a, placebos_b):
    """Takes two mappings of placebo to value and returns a mapping of the
     placebos common to both arguments mapping to the sum of both values.
 
     >>> add_common_placebos({'a': 1, 'b': 2, 'c': 3}, {'b': 4, 'd': 5, 'e': 6})
     {'b': 6}
 
     """
    common_keys = set(placebos_a.keys()) & set(placebos_b.keys())
    return dict((k, placebos_a[k] + placebos_b[k]) for k in common_keys)


def main():
    symptoms = [
        symptom
        for symptom in iter(partial(input, 'Gib ein Symptom ein: '), '')
        if symptom in SYMPTOM_TO_PLACEBOS
    ]

    common_placebos = reduce(
        add_common_placebos, (SYMPTOM_TO_PLACEBOS[s] for s in symptoms)
    )

    for placebo, value in common_placebos.items():
        print('{0}, mit einer Wertigkeit von {1}'.format(placebo, value))


if __name__ == '__main__':
    main()
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Eliazz hat geschrieben: 1. Wie Blackjack bereits sagte: Ich bin ein blutiger Anfänger und habe nicht das nötige Know-How für SQL einbindung.
Ein blutiger Anfänger in Sachen Python bin ich zwar vielleicht nicht mehr, aber ich beschäftige mich auch erst seit einem Dreivierteljahr intensiver (neben Beruf und Familie) damit. Aus Erfahrung kann ich sagen: Keine Angst vor SQL. Es sieht komplizierter aus als es tatsächlich ist.

Für den Firefox gibt es ein Addon names SQLite Manager. Das habe ich mir installiert, ein paar CSV-Dateien importiert und einfach ein Tutorial durchgearbeitet. Dann einfach mal selbst rumgespielt und ausprobiert. Im Grunde machst ja jetzt mit Python auch nichts anderes. Learning by doing.
Eliazz hat geschrieben: 2. Am Ende gibt es für jedes Symptom bis zu 50 mögliche Mittel, welche wiederum ihre eigenen Wertigkeiten haben, das wird dann schwierig in einer Tabelle. Vorallem wenn die Anzahl der Mittel nicht immer übereinstimmt.
Hierzu bräuchtest du dann nur eine zusätzliche Spalte, wo dann die Wertigkeit hinterlegt ist (unter der Annahme, dass ein Heilmittel je nach Symptom eine andere Wertigkeit haben kann. Hat ein Heilmittel grundsätzlich immer die gleiche Wertigkeit, könnte man das in einer weiteren Tabelle abbilden)
Symthom 1 = Heilmittel A = Wertigkeit 1
Symthom 1 = Heilmittel B = Wertigkeit 2
Symthom 2 = Heilmittel A = Wertigkeit 2
Symthom 2 = Heilmittel C = Wertigkeit 1
Symthom 3 = Heilmittel D = Wertigkeit 1

Mit so einer Tabelle ist es letztendlich egal, ob ein Symptom jetzt ein Heilmittel hat oder 50 oder 100. Die Datenbank ist zum Speichern der Daten da und liefert dir auf Anfrage die Daten, die du auch angefordert hat. Mehr passiert da nicht. "Datenbank gibt mir alle Datensätze mit Symptom 1 und 3." Das Ergebnis übergibst du jetzt an dein Programm und arbeitest dann ganz normal damit weiter. Der Unterschied ist nur, wo die Daten gespeichert sind. Bisher sind sie fest in deinem Programm hinterlegt, mit einer Tabelle sind sie in einer Datenbankdatei.

Mit dem SQLite Manager könntest du oder dein Vater die Tabelle vorerst mal auf einfache Weise pflegen. Wenn die Daten allerdings fest im Programmcode integriert sind, könntest nur du an den Daten etwas ändern. Dein Vater hat da sicher keine Lust dazu und falls doch, mag ich jetzt mal bezweifeln, ob das Programm dann nachher noch korrekt läuft.

Wenn du dann irgendwann später mal etwas mehr Erfahrung hast, kannst du dich auch an eine GUI für dein Programm wagen. Nicht nur zum Abfragen der Daten sondern auch zum komfortablen Verwalten. Da wird aber sicher noch einige Zeit vergehen.

mfg
BlackJack

@bfm: Die Syntax von Python-Wörterbüchern und Listen wird man einem Laien wohl schon noch erklären können. Sofern das aus dem bereits vorhandenen Daten nicht auch so schon ersichtlich wird. Wer das nicht hinbekommt wäre auch überfordert die SQL-Tabellen von Hand zu pflegen was zwar durch so etwas wie SQLiteManager über eine GUI passieren kann, dafür muss man sich aber die IDs die als Fremdschlüssel auf die anderen Tabellen zeigen, per Hand raussuchen.

Und egal wie einfach oder kompliziert SQL ist, es ist eine zusätzliche Front die dazu kommt, mit Syntax, vielen neuen Begriffen, und Richtlinien wie man einen guten Datenbankentwurf macht, eine zusätzliche API die man lernen muss, Fallstricke wie SQL-Injection auf die man achten muss, und das für jemanden der noch nicht einmal beim Abschnitt „Funktionen” beim lernen von Python angekommen ist.
Antworten