Variablen kombinieren

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.
Benutzeravatar
BigSanch
User
Beiträge: 16
Registriert: Dienstag 6. Oktober 2020, 06:52

Hallo

Ich bin mir nicht ganz sicher wonach ich eigentlich suchen soll, daher hab ich auch nicht richtig vorab gesucht.
Das einzige auf die Schnelle war join(), was aber nicht ganz das ist was ich wohl brauche.

Folgendes:
ich habe zb folgende Variablen :

Code: Alles auswählen

decode = [ZEICHEN FÜR DE]
encode = [ZEICHEN FÜR EN]
Dann hab ich die Variablen aus einer if Abfrage :

Code: Alles auswählen

landcode = getlangfromfunction
{Ausgabe  ist de, en ....}
Wie ist es mir möglich die beiden Variablen so zu kombinieren, dass sie als neue Variable und nicht als Ausgabetext fungieren?
Damit es dann so etwa wäre (als Beispiel) :

Code: Alles auswählen

landcode = getlangfromfunction (=de)
decode = [ZEICHEN FÜR DE]

if landcode == 'de':
	ausgabe = landcode+'code'
Dies ergibt aber als Ausgabe nicht wie gewünscht '[ZEICHEN FÜR DE]', sondern eben einfach nur 'decode' als Text.
Wie erhalte ich nun aber die bereits gesetzte Variable? Nach was genau suche ich da?
Ich hoffe ich hab das nun nicht zu umständlich erklärt.

Danke für Eure Zeit und mfG
Danke für Eure Zeit und Antworten
mfG Big Sanch
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BigSanch hat geschrieben: Mittwoch 14. Oktober 2020, 06:45

Code: Alles auswählen

landcode = getlangfromfunction (=de)
decode = [ZEICHEN FÜR DE]

if landcode == 'de':
	ausgabe = landcode+'code'
Dies ergibt aber als Ausgabe nicht wie gewünscht '[ZEICHEN FÜR DE]', sondern eben einfach nur 'decode' als Text.
Na klar. An "landcode" wurde "de" zugewiesen, wenn die if-Bedingung zutrifft und der Block betreten wird. Daher:
landcode + "code" -> "de" + "code" -> "decode"

Wieso sollte Python da auf [ZEICHEN FÜR DE] kommen und was soll das überhaupt sein?
Benutzeravatar
BigSanch
User
Beiträge: 16
Registriert: Dienstag 6. Oktober 2020, 06:52

snafu hat geschrieben: Mittwoch 14. Oktober 2020, 06:56 Na klar. An "landcode" wurde "de" zugewiesen. Daher:
landcode + "code" -> "de" + "code" -> "decode"
Weiß ich, hab ich ja auch so geschrieben, beantwortet also meine Frage nicht :-)
snafu hat geschrieben: Mittwoch 14. Oktober 2020, 06:56Wieso sollte Python da auf [ZEICHEN FÜR DE] kommen ...
Das war hier meine Frage :-)
snafu hat geschrieben: Mittwoch 14. Oktober 2020, 06:56... und was soll das überhaupt sein?
Naja grundsätzlich ist das doch Wurst, was da dann steht oder nicht, es geht grundsätzlich um die Funktion die Variablen so zu kombinieren, dass eben das richtige angezeigt wird.
Aber um es etwas zu definieren geht es bei landcode und Zeichen für DE wahrscheinlich um Sprach und Ländercodes ;-)
Danke für Eure Zeit und Antworten
mfG Big Sanch
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier ein zweiter Versuch, da es im ersten Anlauf offensichtlich nicht bei dir angekommen ist: Python kann nicht magisch raten, was du eigentlich willst, sondern Python führt aus, was du hingeschrieben hast. Im übrigen nennt sich der Vorgang, von dem du sprichst, nicht kombinieren, sondern konkatenieren, aber das nur am Rande. Also nochmal: Woher kommt [ZEICHEN FÜR DE]? Soll das ein Ländercode sein? Geht es da um das Ergebnis einer Übersetzung oder um die Dekodierung eines Zeichensatzes, nur eben pro Zeichen betrachtet? Wenn du konstruktive Hilfe brauchst, dann solltest du schon mehr Hintergrund-Infos liefern. Wir können schlecht raten, was du schon alles weißt bzw als Voraussetzung für die Aufgabe mitnimmst...
BigSanch hat geschrieben: Mittwoch 14. Oktober 2020, 07:13 Aber um es etwas zu definieren geht es bei landcode und Zeichen für DE wahrscheinlich um Sprach und Ländercodes ;-)
Na, aber das ist doch de bzw de_DE, also genau korrekt, so wie es geliefert wird. Wo liegt dann dein Problem? Was willst du wirklich als Ausgabe?
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Na etwas unklar drückst du dich schon aus, aber ich versuche es trotzdem mal:

Code: Alles auswählen

decode="deutsch"
encode="english"

langcode="de"

abc=("Language:"+encode, "Sprache: "+decode)[langcode=="de"]

print(abc)
Das nennt sich "ternärer Operator" und ist eigentlich nichts anderes wie
eine Kompaktversion von IF...ELSE(für True/False)
Zuletzt geändert von tonikae am Mittwoch 14. Oktober 2020, 08:07, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@BigSanch: Was ist denn das für eine nervig lange Signatur?

Das Problem ist, dass du hier irgendwelchen Pseudo-Code zeigst, der syntaktisch leider überhaupt gar keinen Hinweis liefert, was du überhaupt vor hast. Was soll denn [ZEICHEN FÜR DE] sei? Eine Liste? Ein einziges Zeichen? Und was ist für ein Typ mit welchem Inhalt ist die Rückgabe von getlangcode?
Das musst du, am besten mit einem Beispiel zeigen - und was du als Ergebnis erwartest. Und das nicht "beschreiben".
Benutzeravatar
BigSanch
User
Beiträge: 16
Registriert: Dienstag 6. Oktober 2020, 06:52

EDITIERT UND GELÖSCHT - Da ich das zu spät gesehen habe, dass bereits eine neue Antwort dabei ist.
tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 08:00 Na etwas unklar drückst du dich schon aus, aber ich versuche es trotzdem mal:

Code: Alles auswählen

decode="deutsch"
encode="english"

langcode="de"

abc=("Language:"+encode, "Sprache: "+decode)[langcode=="de"]

print(abc)
Ich wollte grad eben schreiben, dass wir Verständigungsprobleme am frühen morgen haben :-)
Ich danke Dir für deine Antwort, das war exact das was ich gesucht habe.

sparrow hat geschrieben: Mittwoch 14. Oktober 2020, 08:02 @BigSanch: Was ist denn das für eine nervig lange Signatur?

Das Problem ist, dass du hier irgendwelchen Pseudo-Code zeigst, der syntaktisch leider überhaupt gar keinen Hinweis liefert, was du überhaupt vor hast. Was soll denn [ZEICHEN FÜR DE] sei? Eine Liste? Ein einziges Zeichen? Und was ist für ein Typ mit welchem Inhalt ist die Rückgabe von getlangcode?
Das musst du, am besten mit einem Beispiel zeigen - und was du als Ergebnis erwartest. Und das nicht "beschreiben".
Naja dann eben falsch ausgedrückt, es sollte kein PseudeoCode sein sondern eben der vorhande Code, diesen in Klammern [] zu packen, was auch für Listen gilt, war etwas unpraktisch .-)
Dabhte aber als "Zeichen für de" klar nur ein Zeichen für de in Frage kommt .-)
Zuletzt geändert von BigSanch am Mittwoch 14. Oktober 2020, 08:35, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Du beschreibst schon wieder. Und das ist in meinen Augen völlig wirr.

Ich kann echt nur raten, was du willst. Du willst dynamisch Variablennamen zusammensetzen. Und das macht man nicht. Dafür gibt es Wörterbücher.

Edit: Wenn du denkst, dass das was du da gezeigt bekommen hast, die Lösung ist, dann suchst du definitiv ein dict.
Benutzeravatar
BigSanch
User
Beiträge: 16
Registriert: Dienstag 6. Oktober 2020, 06:52

Sry hab ich Editiert:
viewtopic.php?f=1&t=49883#p374628
Danke für Eure Zeit und Antworten
mfG Big Sanch
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was Du willst, ist eine Zuordnung von einem Wert (Ländercode) zu einem [ZEICHEN]. Diese Zuordnung beschreibt man in der Programmierung als Wörterbuch:

Code: Alles auswählen

language_to_code = {
    "DE": "Zeichen_DE",
    "EN": "Zeichen_EN",
}
language = 'DE'
print(language_to_code[language])
Benutzeravatar
BigSanch
User
Beiträge: 16
Registriert: Dienstag 6. Oktober 2020, 06:52

@Sirius3
Danke, das ist genial. Danke.
Mit dem anderen Code von @tonikae war trotzdem auch hilfreich und lehrreich, aber in meinem Fall ist ein Wörterbuch wohl das effektivste.
Danke für Eure Zeit und Antworten
mfG Big Sanch
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@BigSanch: Der Code von tonikae ist aber unpythonisch, denn das ist *nicht* der ternäre Operator sondern ein Hack. Den man nicht anwendet, weil Python tatsächlich einen ternären Operator hat, den man dann auch verwenden sollte:

Code: Alles auswählen

abc = "Sprache: " + decode if language_code == "de" else "Language: " + encode
Wobei man bei dieser Art von Entscheidungen auch immer bedenken sollte, dass das nicht wirklich eine Entscheidung zwischen "de" und irgend etwas anderem ist, sondern zwischen "de" und "en", das heisst falls `language_code` einen unerwarteten Wert hat, wird der wie "en" behandelt. Das kann so gewollt sein, es kann aber auch sein, dass man nicht möchte, dass dieser Fall einfach so unbemerkt durchrutschen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 08:00

Code: Alles auswählen

decode="deutsch"
encode="english"

langcode="de"

abc = ("Language:" + encode, "Sprache: " + decode)[langcode=="de"]

print(abc)
Da habe ich erst mal 5 Minuten für gebraucht um das zu verstehen.
Die Subskription in den eckigen Klammern ist entweder True oder False.
True == 1
False == 0

Also wird, wenn langcode == "de" wahr ist, wird Index 1 genommen, ansonsten Index 0.
Das ist aber kein ternärer Operator, sondern ein übler Hack.


Einfach den richtigen Datentypen wählen und schon hat man kein Problem mehr.
Das dict wäre auch meine erste Wahl gewesen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

DeaD_EyE hat geschrieben: Mittwoch 14. Oktober 2020, 14:07
tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 08:00

Code: Alles auswählen

decode="deutsch"
encode="english"

langcode="de"

abc = ("Language:" + encode, "Sprache: " + decode)[langcode=="de"]

print(abc)
Da habe ich erst mal 5 Minuten für gebraucht um das zu verstehen.
Die Subskription in den eckigen Klammern ist entweder True oder False.
True == 1
False == 0

Also wird, wenn langcode == "de" wahr ist, wird Index 1 genommen, ansonsten Index 0.
Das ist aber kein ternärer Operator, sondern ein übler Hack.


Einfach den richtigen Datentypen wählen und schon hat man kein Problem mehr.
Das dict wäre auch meine erste Wahl gewesen.
Du schreibst schlicht und einfach Unfug.
Das ist ein ganz regulärer tenärer Operator
Das kann man sogar in Büchern nachlesen
und sogar noch weiter ausbauen. Das läßt sich
sogar in einen Print-Befehl einklinken.

Code: Alles auswählen

print((1/0, 2)[condition])
#ZeroDivisionError is raised
Guckst du hier...da steht alles
https://book.pythontips.com/en/latest/t ... ators.html

Der einzige Unterschied ist nur die Schreibweise.
In richtigen Programmiersprachen werden tenäre Operatoren mit dem "?" und ":"-Zeichen gehandhabt
Das Ablaufschema ist aber identisch.

-->--(?)---[Bedingung]---[True]--(:)--[False]
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was unterscheidet richtige von falschen Programmiersprachen?
Nicht alles, was irgendwer ins Internet schreibt ist auch richtig. Ich verrate mal ein Geheimnis: da kann jeder alles mögliche schreiben.

Ein richtiger ternärer Operator schreibt man mit r und wertet nur den Ausdruck aus, der auch gebraucht wird.
Aber es gibt tatsächlich einen alternativen ternären Operator in Python, nur ist das halt etwas anderes als eine Liste.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 20:07 Du schreibst schlicht und einfach Unfug.
Das ist ein ganz regulärer tenärer Operator
Das kann man sogar in Büchern nachlesen
[...]
https://book.pythontips.com/en/latest/t ... ators.html
Deine Variante steht da als "obscure and not widely used example", aber definitiv nicht als der ternäre Operator von Python. Was der ternäre Operator ist kannst du in der offiziellen Dokumentation nachlesen: Conditional expressions
tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 20:07 In richtigen Programmiersprachen werden tenäre Operatoren mit dem "?" und ":"-Zeichen gehandhabt
Offensichtlich nicht.

Ich schätze frische Ideen sehr. Angesichts der unhaltbaren Aussagen, die du tätigst, verlasse ich mich dann aber doch lieber auf die Expertise von Leuten die Python seit über 10 und teilweise auch seit über 20 Jahren aktiv einsetzen.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 20:07 Du schreibst schlicht und einfach Unfug.
Das ist ein ganz regulärer tenärer Operator
Das kann man sogar in Büchern nachlesen
und sogar noch weiter ausbauen. Das läßt sich
sogar in einen Print-Befehl einklinken.

Code: Alles auswählen

print((1/0, 2)[condition])
#ZeroDivisionError is raised
Guckst du hier...da steht alles
https://book.pythontips.com/en/latest/t ... ators.html
Und genau an dieser Stelle geht es los mit der Erklärung des richtigen ternären Operators in Python. Die von Dir anscheinend bevorzugte Variante wird dann eingeleitet mit: "Another more obscure and not widely used example involves tuples." Sie wird, so weit ich es bei schnellem Durchlesen beurteilen kann, korrekt kritisiert. Was mir in dem Abschnitt dann allerdings zu kurz kommt, sind die Probleme, die man sich mit der zuletzt beschriebenen Variante "Shorthand Ternary" einhandeln kann (das alte Verfahren "value = result or default" statt "value = result if result else default").
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tonikae: „In richtigen Programmiersprachen” ist ein bisschen anmassend. Als wenn nur Programmiersprachen mit C-ähnlicher Syntax ”richtige” Programmiersprachen wären. Ausserdem ist die Bezeichnung „ternärer operator“ in C & Co auch nur deswegen richtig für das um was es hier geht, weil es dort nur diesen einen Operator mit drei Operanden gibt. „Bedingungsoperator“ wäre ein passenderer Name. Denn man kann sich ja auch ternäre Operatoren vorstellen die etwas völlig anderes machen. SQL kennt beispielsweise den ternären Operator ``<value> BETWEEN <a> AND <b>`` der testet ob ein gegebener Wert in einem bestimmten Bereich liegt.

In Python würde ich das auch eher bedingten Ausdruck nennen, denn ein Operator ist es letztlich ja nicht wirklich.

In VisualBasic .NET und in Io schreibt man das als ``if(<condition>, <true_case>, <false_case>)``. In VB.NET ist das Syntax, in Io eine normale Methode. In Haskell und CoffeeScript ist es ``if <condition> then <true_case> else <false_case>``. In Haskell dürfen die Fälle wie in VB.NET nur einfache Ausdrücke sein, in CoffeeScript dagegen auch mehrere Anweisungen. Letzteres sieht in Lisp/Scheme & Co so aus ``(if <condition> <true_case> <false_case>)`` und ist auch sowohl Ausdruck mit einem Ergebnis als auch das Mittel für bedingte Ausführung von Anweisungen wegen des Effektes statt des Ergebnisses. Auch alles ”richtige” Programmiersprachen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 20:07 Du schreibst schlicht und einfach Unfug.
Das ist ein ganz regulärer tenärer Operator
Das kann man sogar in Büchern nachlesen
und sogar noch weiter ausbauen. Das läßt sich
sogar in einen Print-Befehl einklinken.
Andern Unfug vorwerfen, aber selbst kräftig solchen verzapfen.

Denn natürlich ist das kein normaler ternärer Operator, sondern eine Hilfskonstruktion Zaus Zeiten, in den Python den noch nicht hatte. Mit einem bedeutenden semantischen Unterschied - er kürzt nämlich nicht ab. Mit deinem Konstrukt werden IMMER beide Zweige ausgewertet, und bei sowas hier

Code: Alles auswählen

(teuer(), teurer())[a == b]
zahlst du den Preis. Von wegen “der einzige Unterschied ist die Schreibweise”

Was übrigens auch in dem von dir zitierten Buch als Negativbeispiel steht. So weit wars dann mit dem Textverständnis nicht her.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

tonikae hat geschrieben: Mittwoch 14. Oktober 2020, 20:07 Du schreibst schlicht und einfach Unfug.
Das ist ein ganz regulärer tenärer Operator
Das kann man sogar in Büchern nachlesen
und sogar noch weiter ausbauen. Das läßt sich
sogar in einen Print-Befehl einklinken.
In Lehrbüchern steht viel Mist drin. Ein gutes Beispiel hast du uns präsentiert.

Ich halte mich an die Dokumentation von Python: https://docs.python.org/3/reference/exp ... xpressions
Dort wird auf PEP308 verwiesen: https://www.python.org/dev/peps/pep-0308/

Zeig mir die Stelle, wo deine Vorgehensweise als "ternary operator" beschrieben wird.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten