Variablenname durch Wert ausfindig machen

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.
Frostie
User
Beiträge: 15
Registriert: Freitag 14. April 2017, 18:16

Hallo liebe Community!

Habe hier eine Liste mit Variablen:

Code: Alles auswählen

eins = 1
zwei = 2
drei = "drei"
vier = 4
Nun möchte ich anhand eines Werts den Variablennamen herausfinden, doch ich weiß nicht wie und auf Google habe ich auch nichts gefunden (das Problem ist eigentlich wie man sowas googlet :D)
Wenn ich beispielsweise den Wert 4 habe soll Python mir "vier" ausspucken.

Ich habe zum Beispiel folgendes versucht:

Code: Alles auswählen

print([i for i in locals() if 2 in locals()])
So wollte ich zumindest die Variablen ausfindig machen aber es hilft nicht, auch nicht mit globals().

Habt ihr eine Idee wie man den Namen durch einen Wert herausfinden? Ein Dankeschön für jede Antwort!

Grüße, Frostie
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Frostie: das geht so allgemein nicht. Warum möchtest Du es überhaupt machen?
Frostie
User
Beiträge: 15
Registriert: Freitag 14. April 2017, 18:16

Einen Zahl-zu-Text-Konverter auf deutsch, also 1 --> eins, 7 --> sieben usw.
Gibt natürlich eine andere Methode, aber diese schien für mich die leichteste sowas umzusetzen. Denkst du es geht besser?
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Frostie hat geschrieben:Einen Zahl-zu-Text-Konverter auf deutsch, also 1 --> eins, 7 --> sieben usw.
Gibt natürlich eine andere Methode, aber diese schien für mich die leichteste sowas umzusetzen. Denkst du es geht besser?
Für einfache Abbildungen dieser Art nimmt man in Python in der Regel ein Dictionary.
Frostie
User
Beiträge: 15
Registriert: Freitag 14. April 2017, 18:16

Wie gehe ich da vor?
Es gibt ja "inflections", aber das ist auf Englisch.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Frostie: Du möchtest ja gerade dem umgekehrten Weg, 7->sieben und definierst aber sieben=7. In Deinem Fall reicht sogar eine Liste:

Code: Alles auswählen

EINER = ["null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neuen"]
print(EINER[7])
BlackJack

@Frostie: Ein Dictionary oder Wörterbuch ist eine Datenstruktur. Python hat da einen Datentyp für: `dict` und da es einer der Grunddatentypen ist sogar eigene Syntax um literale Werte von diesem Typ schreiben zu können. Arbeite am besten mal ein Grundlagentutorial durch um die Kontroll- und Datenstrukturen von Python kennen zu lernen.

Das was Dir am leichtesten schien ist am schwierigsten, weil so grundsätzlich gar nicht vorgesehen. Denn ein Wert kann auch an gar keinen oder aber an mehr als einen Namen gebunden sein, es gibt also nicht *den* Namen zu einem Wert.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Frostie: natürlich geht das:

Code: Alles auswählen

eins = 1
zwei = 2
drei = "drei"
vier = 4


def output(value,dictionary=locals()):
    for i in dictionary:
        if dictionary[i] == value:
            print(i)

output(4)
BlackJack

@Alfons Mittelmeyer: Trollst Du eigentlich absichtlich oder ist das eine Persönlichkeitsstörung bei Dir?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Trollst Du eigentlich absichtlich oder ist das eine Persönlichkeitsstörung bei Dir?
Was soll das, ob ich trolle? Ich habe exakt diese Frage von Frostie beantwortet: "Habt ihr eine Idee wie man den Namen durch einen Wert herausfinden?"

Und Frostie brachte ein Codebeispiel, das nicht funktionierte. Ich zeigte dann genau den Code, der funktioniert.

Das war aber nur die Eingangsfrage. Habe jetzt gerade auch gelesen, dass er das will, um Zahlen in Text umzuwandeln. Das freilich macht man dann nicht so.
BlackJack

@Alfons Mittelmeyer: Ich habe nicht gefragt *ob* Du trollst…
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Da kommt mir wieder im Sinn, dass viele einfach nicht wissen können wie man eine bestimmte Aufgabe löst.
Wir sind ja nicht als Programmierer geboren worden.

Meist haben die Menschen dann schon einen vorgefassten Weg, der aber oftmals in die falsche Richtung führt.
Dann kommen solche Antworten bei raus, die den falschen Weg beschreiben:

Code: Alles auswählen

[key for key, value in globals().items() if value == 42]
Sieht schick aus, führt aber am Ziel vorbei. Klar geht das, es ist aber falsch.
Das Beispiel am besten wieder ganz schnell vergessen.

Grundsätzlich sollte man die Datenstrukturen kennen und sich selbst immer hinterfragen, ob man gerade die richtige Datenstruktur verwendet. Wenn es unnötig kompliziert wird, hat man oftmals die falsche Datenstruktur. Wie bereits vorgeschlagen wäre ein Dict oder eine Liste die einfachste Lösung.

Dein Codebeispiel:

Code: Alles auswählen

eins = 1
zwei = 2
drei = "drei"
vier = 4
Würde ich so abändern:

Code: Alles auswählen

mapping = {1: 'eins', 2: 'zwei', 'drei': 'drei', 4: 'vier'}
Anstatt die Variablennamen als Keys zu nehmen, hab ich deine Werte verwendet, die du ja abfragen möchtest. Die Variablennamen waren das, was du dann einsetzen möchtest. Im Dict sind es dann die Werte, die dir zurückgeliefert werden. Der Zugriff auf ein Dict ist außerdem aufgrund der Implementierung auch sehr schnell.


Der Zugriff auf das Dict kann dann auf zwei Arten geschehen:

Code: Alles auswählen

mapping[1]
Würde dann 'eins' zurückgeben

Wenn der Key nicht existiert, bekommt man einen KeyError:

Code: Alles auswählen

mapping['foo']
-> KeyError

Alternativ kann man die get Methode des Dicts verwenden. Der Vorteil ist, dass man Standard-Rückgabewerte definieren kann, falls der Key nicht vorhanden ist. Standardmäßig wird None zurückgegeben, wenn der Key nicht gefunden wird.

Code: Alles auswählen

mapping.get('foo')
-> NoneType

Hier nochmal mit Standard-Rückgabewert, falls der Key nicht gefunden wird.

Code: Alles auswählen

mapping.get('foo', 42)
-> 42

Mal ein Beispiel, wie man aus einer Liste eine neue Liste mit dem Mapping erstellen möchte:

Code: Alles auswählen

def get(list_input, mapping):
    ret = []
    for element in list_input:
        new = mapping.get(element)
        ret.append(new)
    return ret

get([1,4,'drei'], mapping)
['eins', 'vier', 'drei']

get([1, 4, 42, 'drei'], mapping)
['eins', 'vier', None, 'drei']
Das gleiche nochmal als Funktion mit list comprehension:

Code: Alles auswählen

def get(list_input, mapping):
    return [mapping.get(element) for element in list_input]
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Frostie
User
Beiträge: 15
Registriert: Freitag 14. April 2017, 18:16

Vielen Dank an euch! @Alfons Mittelmeyer, der Code funktioniert, vielen vielen Dank! :D
DeaD_EyEs Beitrag hat mich auch sehr überzeugt!
Mein Wissen über Datenstrukturen und Ähnliches ist leider noch nicht sehr ausgeweitet aber demnächst habe ich Lust und Zeit für dieses Thema.

Und bitte nicht so unhöflich zu den anderen. Das mit der Persönlichkeitsstörung fand' ich echt nicht nett.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Frostie: Du bist in Python noch neu, gleichfalls neu hier im Forum und dadurch prompt das Opfer von Alfons geworden. In Deinem Fall genügt tatsächlich eine Liste, also das Beispiel von Sirius3.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Frostie: der Code von Alfons Mittelmeyer ist nur dazu da, zu zeigen, dass man irgendwie alles hinbekommen kann. Das ist wirklich nichts, was man benutzen sollte, weil es sehr instabil ist. Lerne den Umgang mit Datenstrukturen, wie Listen und Wörterbücher, die wirst Du sowieso ständig brauchst.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Frostie hat geschrieben:Vielen Dank an euch! @Alfons Mittelmeyer, der Code funktioniert, vielen vielen Dank! :D
Für die Umwandlung von Zahlen in Worte war mein Code nicht gedacht, denn wie würdest Du damit das machen?

einhundertdreiundzwanzigmilliardenvierhundertsechsundfünfzigmillionensiebenhundertneunundachtzigtausendeinhundertdreiundzwanzig

Damit aber geht es:

Code: Alles auswählen

# -*- coding: utf-8 -*-

EINER = ('null','ein','zwei','drei','vier','fünf','sechs','sieben','acht','neun','zehn','elf','zwölf','dreizehn','vierzehn','fünfzehn','sechzehn','siebzehn','achtzehn','neunzehn')
ZEHNER = ('','zehn','zwanzig','dreißig','vierzig','fünfzig','sechzig','siebzig','achtzig','neunzig')

def convert_small_number_to_word(value):
    wort = ''
    hunderter = value // 100
    if hunderter:
        wort = EINER[hunderter] + 'hundert'
        value %= 100
        if value == 0:
            return wort

    zehner = value // 10
    if zehner < 2:
        if value == 1:
            wort += "eins"
        else:
            wort += EINER[value]
    else:
        einer = value % 10
        if einer != 0:
            wort += EINER[einer]+'und'+ZEHNER[zehner]
        else:
            wort += ZEHNER[zehner]
    return wort


def convert_number_to_word(value):
    if value >= 1000000000000:
        print("Wert zu hoch")
        return False

    begin_value = value
    wort = ''
    if value >= 1000000000:
        milliarden = value // 1000000000
        if milliarden == 1:
            wort = 'einemilliarde'
        else:
            wort = convert_small_number_to_word(milliarden) + 'milliarden'
        value %= 1000000000
            
    if value >= 1000000:
        millionen = value // 1000000
        if millionen == 1:
            wort += 'einemillion'
        else:
            wort += convert_small_number_to_word(millionen) + 'millionen'
        value %= 1000000

    if value >= 1000:
        tausend = value // 1000
        wort += convert_small_number_to_word(tausend) + 'tausend'
        value %= 1000

    if value == 0 and begin_value != 0:
        return wort

    wort += convert_small_number_to_word(value)
    return wort


while True:
    a = input("Zahl: ")
    print(convert_number_to_word(a))
Billionen und Billiarden usw. könnte man noch anfügen
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Frostie hat geschrieben:Vielen Dank an euch! @Alfons Mittelmeyer, der Code funktioniert, vielen vielen Dank! :D
Man kann auch mit dem Hammer Schrauben in Dübel klopfen und behaupten, dass es ja funktioniert.

Anders ausgedrückt: In dem angegebenen Minimalbeispiel funktioniert es, trotzdem ist die Lösung grundsätzlich Mist.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

/me hat geschrieben:
Frostie hat geschrieben:Anders ausgedrückt: In dem angegebenen Minimalbeispiel funktioniert es, trotzdem ist die Lösung grundsätzlich Mist.
Die eine Lösung bezog sich auf "Variablenname durch Wert ausfindig machen". Dafür ist sie kein Mist, sondern genau richtig. Allerdings damit Zahlen in Worte verwandeln wollen, das ist Mist!
BlackJack

@Alfons Mittelmeyer: Eine Lösung für etwas was man nicht machen sollte ist Mist. Das scheint ein Muster bei Dir zu sein…
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Eine Lösung für etwas was man nicht machen sollte ist Mist.
Wieso sollte man das nicht machen? Für den beabsichtigeten Zweck sollte man das nicht machen, das wäre Mist. Ein sinnvoller Zweck fällt mir allerdings nicht ein. Wenn mir kein sinnvoller Zweck einfällt, heißt das noch nicht, dass es keinen gibt, höchstens dass ich noch keinen gefunden habe und evtl. ein anderer auch noch nicht. Aber vielleicht findet noch jemand einen.
Antworten