Elemente aus Liste extrahieren und in Variable speichern

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
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Hallo ich komme bei einer Python-Aufgabenstellung nicht weiter.
Aus folgender Liste:

Code: Alles auswählen

Ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]
sollen nun die Zahlenwerte als eigene Variablen gespeichert werden (als float Datentyp), im Sinne von:
Konzert = 20.0

Die Aufgabenstellung sollte definitiv mit einfachen / elementaren Mitteln lösbar sein. Aber irgendwie fällt mir nicht ein, wie ich das machen soll:
Ich habe derzeit folgende Lösungsvariante:

Code: Alles auswählen

Ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

Konzert = Ausgaben.pop(0)
Konzert = Konzert.strip(" Konzert = ")
Konzert = float(Konzert)
Ich bin mir allerdings nicht sicher, ob das die eleganteste Möglichkeit ist. Aufgrund der Tatsache, dass es ein Drei-Zeiler ist, gehe ich eher nicht davon aus.
Bezüglich der Zeile:

Code: Alles auswählen

Konzert = Konzert.strip(" Konzert = ")
Ich glaube wir dürfen die Information nutzen, was vor der Zahl steht. Also wäre das theoretisch so zugelassen. Falls die Aussage keinen Sinn macht, vergesst es einfach.

Könnt ihr mir hierbei weiterhelfen?
LG
Spedex
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Zu erst musst du lernen wie man auf einzelne Elemente einer Liste zugreift bzw. die Elemente der Liste durchläuft. Ansonsten brauchst du eigentlich nur noch die .split() Methode.

Zu durchläufst dann jedes Element der Liste und splittest das aktuelle Element am Gleichheitszeichen, daraus entsteht dann eine Liste mit zwei Werten, diese Liste lässt du dir ausgeben und schaust welchen wert du dafür benötigst und wandelst diesen dann in ein float um.

Mit List comprehension lässt sich das dann in einer Zeile lösen.
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Wenn ich die originale Liste am Gleichheitszeichen splitte, komme ich auf folgende Liste:

Code: Alles auswählen

[[' Konzert ', '20'], ['Kino ', ' 20.5'], ['  Sportschuhe    ', '60']]
Also entstehen hier Listen innerhalb einer Liste, sehe ich das richtig.
Wenn ich jetzt drauf zugreifen möchte, komm ich nicht zu 20.
Ich hab das beispielsweise so probiert:

Code: Alles auswählen

Ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

Ausgaben = [i.split("= ") for i in Ausgaben]
print(Ausgaben)

Konzert = Ausgaben[0[1]]
print(Konzert)
Das funktioniert nicht.
Waren die vorherigen Schritte richtig?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Die ersten zwei Zeilen sehen schon mal ganz gut aus, nur in der zweiten Zeile fehlt ein Indexzugriff. Du musst jetzt noch dafür Sorgen, dass das zweite Element (Index 1) der Liste genommen wird, welche split("=") liefert.

Heraus kommt dann folgende Liste: [20.0, 20.5, 60.0], also nur die Zahlenwerte.
Zuletzt geändert von Jankie am Donnerstag 22. Oktober 2020, 10:48, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Spedex: `strip()` macht nicht das was Du anscheinend denkst. Das funktioniert hier nur zufällig. Du hättest auch ``Konzert.strip(" =Kenortz")`` schreiben können, das hat den gleichen Effekt. Aber dann fällt eher auf, dass das doch eher komisch und nicht der richtige Weg ist.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Die Zahlenwerte sollen ziemlich sicher *nicht* als eigene Variablen angelegt werden, es sei denn es sind immer genau diese drei. Dann würde ich mich fragen warum die *so* in einer Liste stehen‽

Du versuchst da das zweite Element (weil Indexwerte ja bei 0 anfangen) von der Zahl 0 abzufragen (``0[1]``). Da solltest Du die entsprechende Ausnahme bekommen. Ich sehe aber nicht warum Du erst eine Liste mit den gesplitteten Werten erstellen musst um *da* dann auf das erste Element zuzugreifen. Du kannst ja auch auf das erste Element zugreifen und es *dann* splitten. Wenn es tatsächlich drei einzelne Variablen werden sollen, deren Werte an einem festen Index in der Ausgangsliste stehen, dann brauchst Du keine Schleife oder neue Liste. Dann würde man das holen eines Wertes als Zahl eher in eine Funktion schreiben, die man dann für jede der drei Variablen aufruft.

`split()` ohne irgendwelche Einschränkungen wäre nicht meine erste Wahl. Ich würde wahrscheinlich `partition()` zum zerlegen verwenden. Und explizit prüfen ob da a) ein Gleichheitszeichen als zweites Element bei heraus kommt, und ob das erste Element den erwarteten Wert hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Hmm,
also mit zweiter Zeile meinst du die vierte Zeile oder?

Code: Alles auswählen

Konzert = Ausgaben[0]
Es fehlt ein Indexzugriff?
Mit dem ursprünglichen Code

Code: Alles auswählen

Konzert = Ausgaben[0[1]]
Wollte ich ja von dem ersten Eintrag der Liste den zweiten Eintrag der Unterliste nehmen, nur dass das so mit der Syntax nicht passt.
Was meinst du mit
Du musst jetzt noch dafür Sorgen, dass das zweite Element (Index 1) der Liste genommen wird, welche split("=") liefert.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Versuch dir einfach immer die Zwischenergebnisse mit print() auszugeben. Dann siehst du, dass wenn du die split("=") Methode auf einem Element der Liste aufrufst folgendes herauskommt:
[' Konzert ', ' 20']. Also eine Liste. Von dieser Liste brauchst du denn zweiten Wert (also Index 1).

Versuch einfach mal dass hier nur das zweite Element der Liste ausgegeben wird, wenn du das dann gemacht hast kannst du es mal mit einer List comprehension versuchen.

Code: Alles auswählen

ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

for element in ausgaben:
    print(element.split("="))

Deine Zeile:

Code: Alles auswählen

Ausgaben = [i.split("= ") for i in Ausgaben]
ist schon fast richtig, es Fehlt halt nur noch dass du nicht die gesamte Liste, die i.split("=") zurückliefert nimmst, sondern nur den zweiten Wert davon.

Sonstige Anmerkungen:

Variablen werden laut PEP8 klein_mit_unterstrich geschreiben. Außnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Variablen sollten auch gut benannt sein und aussagen was drin steckt, also i ist schon mal eine schlechter Name.
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Hallo, ich komme auf das gewünschte Ergebnis immer noch nicht mit einer Zeile, aber ich habe bis jetzt das geschafft:

Code: Alles auswählen

Ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

Konzert = Ausgaben[0].split("= ")
Konzert = float(Konzert[1])
Dabei komm ich dann auf das gewünschte Resultat. Pro Listeneintrag wären das dann zwei Zeile, auch nicht schlecht schonmal.
Wenn ich deine for-Schleife probiere, erhalte ich sozusagen drei separate Listen, jeweils mit einem Namen und den Zahlenwert. Ist das von nutzen? Ich weiß nicht, wie ich das verwenden kann.

Achso, jetzt hätte ich es fast wiedr vergessen zu erwähnen: Variablennamen sind nur bedingt frei zu wählen, daher die Großschreibung.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wenn du wirklich jeden Wert davon in einer extra Variable speichern willst gibt es viele Möglichkeiten, eine wäre die von dir gezeigte. Die Lösung die ich im Kopf hätte sähe so aus:

Code: Alles auswählen

ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

ausgaben_extrahiert = [float(ausgabe.split("=")[1]) for ausgabe in ausgaben]
print(ausgaben_extrahiert)
Das liefert dir folgende Liste:

[20.0, 20.5, 60.0]

Auf die du dann zugreifen könntest:

Code: Alles auswählen

konzert_ausgaben = ausgaben_extrahiert[0]
kino_ausgaben = ausgaben_extrahiert[1]
sportschuhe_ausgaben = ausgaben_extrahiert[2]
Ansonsten würde sich ein Dictionary anbieten mit dem Artikel/Dienstleistung als Key und den Ausgaben als Value.
Was hast du denn eigentlich insgesamt vor, oder sind das nur Aufgaben zum üben?

Und wer hat das mit dem "bedingt frei zu wählen"?
Zuletzt geändert von Jankie am Donnerstag 22. Oktober 2020, 14:23, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Erster Schritt wäre es, die Ausgabe in ein Wörterbuch umzuwandeln:

Code: Alles auswählen

ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]
werte = {key.strip(): float(value) for key, _, value in map(lambda t: t.partition('='), ausgaben)}
Ob man dann die einzelnen Elemente noch extra als Variable braucht, ...
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Hey, ich hab jetzt einfach beider Lösungswege hineingegeben. Einmal mein zwei-Zeile Ansatz und dann den mit der for-Schleife (ein-Zeiler).
Ihr müsst verstehen, dass durch die Angabe schon sehr viel vorgegeben ist (zum Beispiel die Namen der Variablen). Außerdem kommt das Wörterbuch erst später vor, also genau genommen direkt im Anschluss. Ob man das jetzt gut findet oder nicht ist eine andere Frage, aber spielt auch keine Rolle.

Wenn noch eine Frage auftretet würde ich die dann direkt hier in den Thread posten .
Benutzeravatar
MaximalMax
User
Beiträge: 18
Registriert: Sonntag 3. Mai 2020, 00:51

Machs doch einfach so:

Code: Alles auswählen

liste = [('Sport', 20.00), ('Kino', 20.30)]

ereignis = liste[0][0]
uhrzeit = liste[0][1]

print(ereignis, uhrzeit)
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MaximalMax: Die Eingabedaten werden sicher von aussen vorgegeben sein, zum Beispiel weil die so aus einer Textdatei kommen, oder weil der Aufgabensteller das so vorgibt. Denn wenn man sich das so aussuchen könnte, dann geht Dein Vorschlag nicht weit genug, denn dann könnte man auch einfach das hier als Lösung vorschlagen:

Code: Alles auswählen

konzert_ausgaben = 20
kino_ausgaben = 20.5
sportschuhe_ausgaben = 60
@Spedex: Die zwei Zeilen lassen sich trivial durch Einsetzen des ersten Teilergebnisses in den zweiten Ausdruck zu einer Zeile zusammen fassen. Bei dem `split()` würde man auch nur das Gleichheitszeichen angeben, ohne Leerzeichen:

Code: Alles auswählen

    ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

    konzert_ausgaben = float(ausgaben[0].split("=")[1])
    kino_ausgaben = float(ausgaben[1].split("=")[1])
    sportschuse_ausgaben = float(ausgaben[2].split("=")[1])
Allerdings wiederholt man als Programmierer keinen Code. Das ist unnötig Arbeit und auch unnötig fehleranfällig. Wenn man jetzt beispielsweise das `split()` auf eine Trennstelle begrenzen oder gar durch `partition()` ersetzen möchte, muss man das drei mal machen und aufpassen, dass man das an jeder Stelle gleichwertig ändert. Darum würde man das in eine Funktion herausziehen:

Code: Alles auswählen

def get_price(text):
    return float(text.split("=")[1])


def main():
    ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

    konzert_ausgaben = get_price(ausgaben[0])
    kino_ausgaben = get_price(ausgaben[1])
    sportschuhe_ausgaben = get_price(ausgaben[2])
Nun kann man leicht an *einer* Stelle von `split()` auf `partition()` umstellen und beispielsweise auch prüfen ob der Name des Postens zu dem passt, was man am jeweiligen Index von `ausgaben` erwartet. Und man muss sich auch keine Gedanken mehr darüber machen ob das nun besonders kurz formuliert ist. Mit sinnvoller Fehlerprüfung werden das auch ein paar Zeilen:

Code: Alles auswählen

def get_price(expected_item_name, text):
    item_name, equal, price_text = text.partition("=")

    if equal != "=":
        raise ValueError("expected '=' in `text`")

    item_name = item_name.strip()
    if item_name != expected_item_name:
        raise ValueError(
            f"expected item namen {expected_item_name}, got {item_name}"
        )

    return float(price_text)


def main():
    ausgaben = [" Konzert = 20", "Kino =  20.5", "  Sportschuhe    = 60"]

    konzert_ausgaben = get_price("Konzert", ausgaben[0])
    kino_ausgaben = get_price("Kino", ausgaben[1])
    sportschuhe_ausgaben = get_price("Sportschuhe", ausgaben[2])
Unschön ist jetzt noch das man hier manuell aufsteigende Indexwerte für die Zugriffe auf `ausgaben` schreiben muss, das schreit nach einer Art von direkter oder indirekter Schleife über die Ausgabenliste. Hier über einen Generatorausdruck:

Code: Alles auswählen

    konzert_ausgaben, kino_ausgaben, sportschuhe_ausgaben = (
        get_price(item_name, text)
        for item_name, text in zip(
            ["Konzert", "Kino", "Sportschuhe"], ausgaben
        )
    )
Oder mit `itertools.starmap()`:

Code: Alles auswählen

    konzert_ausgaben, kino_ausgaben, sportschuhe_ausgaben = starmap(
        get_price, zip(["Konzert", "Kino", "Sportschuhe"], ausgaben)
    )
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten