Dynamische Listen

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
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

Hallo liebes Python Formum!

Ich würde gerne in einer for schleife listen Namen dynamisch vergeben z.B.:

Code: Alles auswählen

liste = ["Größe", "Laenge", "Hoehe", "", "Breite"]
liste2 = [100,20], [20,30],[39, 90],[8,2]
i = 0
for i in range(0,np.shape(liste)[1]-1):
    liste[i] = liste2[i]
    i = i +1
Da ich weitere Werte anhängen möchte an dies Liste ist dies denk ich mal der einfachste Weg allerdings weiß ich nicht wie ich die Listen mit dem entsprechenden Variablen Namen erstellen kann

So soll es aussehen

Größe = [100,20]
Laenge=[20,30]
Hoehe=[39, 90]
Breite= [8,2]

Danke schonmal im Voraus

Ich denke man kann das bestimmt auch mit Listen in Listen lösen weiß allerdings nicht wie
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

Da ist so einiges falsch.
liste2 ist keine Liste, sondern ein Tuple.
Datentypen sollten aber erst gar nicht in Variablennamen vorkommen.
Das i=0 ist unnötig, weil Du in der for-Schleife ja i sofort wieder überschreibst.
Das i = i + 1 ist unnötig, weil Du in der for-Schleife ja i sofort wieder überschreibst.
Um die Länge einer Liste zu bestimmen, ist np.shape wohl das komplizierteste, len wäre das direkteste. Warum willst Du das letzte Element der Liste ignorieren? Über einen Index iteriert man nicht, weil man auch über die Listeneinträge direkt iterieren kann.
Wie willst Du eigentlich den leeren String behandeln?

Was Du suchst, ist ein Wörterbuch.

Code: Alles auswählen

schluessel = ["Größe", "Laenge", "Hoehe", "Breite"]
werte = [100,20], [20,30],[39, 90],[8,2]
parameter = dict(zip(schluessel, werte))
Und dann stellt sich natürlich sofort die Frage, warum Du nicht direkt ein Wörterbuch benutzt:

Code: Alles auswählen

parameter = {
    'Größe': [100, 20],
    'Laenge': [20, 30],
    'Hoehe': [39, 90],
    'Breite': [8, 2],
}
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

Danke schonmal für die schnelle Antwort.
Das war jetzt nur ein Bespiel. Mich würde interessieren oben es möglich ist Listen in der For Schleife dynamisch Namen aus einer Liste zuzuweisen. z.B
Größe = [100, 20 ]
Laenge= [20, 30]
usw.

Denn ich will Mittels append diese dann noch um Eintrage erweitern.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Na, das geht doch prima mit Dictionaries:

Code: Alles auswählen

parameter['Hoehe'].append(42)
Das ist auch das beste Vorgehen. Das was Dir vermutlich vorschwebt, das dynamische Erzeugen von Bezeichnern, ist eine ganz schlechte Idee.
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

YPython1 hat geschrieben: Donnerstag 25. Februar 2021, 14:27Das war jetzt nur ein Bespiel.
Und für dieses Beispiel habe ich Dir eine Lösung gezeigt. Wo hast Du damit noch konkrete Probleme, oder was willst die eigentlich machen, wo Du nicht weiter kommst? Je exakter Du Dein Problem beschreibst, desto besser kann man Dir helfen.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

YPython1 hat geschrieben: Donnerstag 25. Februar 2021, 14:27 Mich würde interessieren oben es möglich ist Listen in der For Schleife dynamisch Namen aus einer Liste zuzuweisen. z.B
Theoretisch ja, praktisch ist so ein Ansinnen aber Quatsch weil es zu unwartbarem Code führt. Genau für so etwas gibt es ja Datenstrukturen wie z.B. ein Dictionary, die genau so etwas abbilden können.
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

Ah ok habe verstanden. In der Schleife werden aber Daten formatiert diese formatierten Daten will ich dann je nach Namen entsprechend in einer Liste mit dem jeweiligen Namen speichern um sie dann nochmals zu formatieren, sodass ich sie dann in eine Datenbank einlesen kann.

Hierfür werden Daten je nach Name aus einem Dataframe ausgelesen.
Diese dann weiterverarbeitet.

Und die neue Liste dann final noch einmal formatiert.

zumindest hatte ich mir das so vorgestellt dafür benötige ich die dynamische Listen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

So wie ich das verstehe, kennst Du die Bezeichner der Listen nicht im voraus. Dann könnte ein "defaultdict" (https://docs.python.org/3/library/colle ... efaultdict) für Deinen Anwendungsfall hilfreich sein..
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn du schon einen Dataframe hast, dann hast du schon eine gute Datenhaltung. Das in Listen umzuspeichern hört sich falsch an. Auch das viele umformatieren, bevor es in einer Datenbank landet, ist komisch.
Kannst du etwas konkreter werden, was du vor hast?
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

Doch ich kenne die Key Elemente, diese setzen sich aus einer Liste zusammen aber die Value Werte dazu kenne ich nicht.

Code: Alles auswählen

#    Formatieren von Aktienkursen
Schlüssel = ["Open", "High", "Low", "Adj Close", "Volume", "Dividends", "Stock Splits"]
i = 0


for i in range(0,np.shape(Schlüssel)[0]-1):
    Schlüssel[i]= set(list(zip(list_of_tickers, [Schlüssel[i]]*len(list_of_tickers))))
    Schlüssel[i] +"STVal" = stock_values_hist[Index[i]]
    Schlüssel[i] + "DB" = np.array((df(STVal[i]).reset_index()).to_numpy().tolist())
    i = i +1

#Diesen Teil möchte ich quasi in eine schleife packen

Open = set(list(zip(list_of_tickers, ["Open"]*len(list_of_tickers))))
High = set(list(zip(list_of_tickers, ["High"]*len(list_of_tickers))))
Low = set(list(zip(list_of_tickers, ["Low"]*len(list_of_tickers))))
Adj_Close = set(list(zip(list_of_tickers, ["Adj Close"]*len(list_of_tickers))))
Vol = set(list(zip(list_of_tickers, ["Volume"]*len(list_of_tickers))))
Div = set(list(zip(list_of_tickers, ["Dividends"]*len(list_of_tickers))))
Split = set(list(zip(list_of_tickers, ["Stock Splits"]*len(list_of_tickers))))

Open_stock = stock_values_hist[Open]
High_stock = stock_values_hist[High]
Low_stock = stock_values_hist[Low]
Adj_Close_stock = stock_values_hist[Adj_Close]
Vol_stock = stock_values_hist[Vol]
Div_stock = stock_values_hist[Div]
Split_stock = stock_values_hist[Split]

DB_Open_stock = np.array((df(Open_stock).reset_index()).to_numpy().tolist())
DB_High_stock = (df(High_stock).reset_index()).to_numpy().tolist()
DB_Low_stock = (df(Low_stock).reset_index()).to_numpy().tolist()
DB_Adj_stock = (df(Adj_Close_stock).reset_index()).to_numpy().tolist()
DB_Vol_stock = (df(Vol_stock).reset_index()).to_numpy().tolist()
DB_Div_stock = (df(Div_stock).reset_index()).to_numpy().tolist()
DB_Split_stock = (df(Split_stock).reset_index()).to_numpy().tolist()
 
hierbei soll der Name der Liste dynamisch sein, sodass wenn neue Faktoren mit einbezogen werden diese einfach nur in der Liste hinzuzufügen sind. Die dazugehörigen Werte sollen dann einzeln in einer Liste stehen ohne die jeweiligen Überschriften, da diese später in einen string umformatiert werden müssen.
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein! Nichts von dem Code brauchst du. Keine einzige Zeile. Arbeite mit dem Dataframe direkt.
Daher die Frage: welche Art von Daten hast du, und welche Transformation willst du machen.
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

habe einen Dataframe mit einer Datumsspalte und den Tickerdaten so wie Open Close usw. darunter stehen also einen Index mit zwei Werten Ticker + Open, Ticker + Close usw. darunter dann die jeweiligen Werte. Diese möchte ich so sortieren, dass die Ticker ein Datum haben und nur noch Open, Close usw. im index steht.
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

Kannst du Beispieldaten posten, sowohl was du hast als auch was du willst. Dann verstehe ich es vielleicht besser.
Suchst du etwa sowas wie groupby?
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

Code: Alles auswählen

Index 0                                   0                        1          ..........
None                                     ABBV                     ABBV         .......
None                                     Open                     High         ........
2015-09-04 00:00:00                     60.25                     60.94         ......
Sieht quasi so aus
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

die liste geht natürlich auch nach unten hin noch weiter
YPython1
User
Beiträge: 26
Registriert: Mittwoch 24. Februar 2021, 21:06

Habe es jetzt so gelöst

Code: Alles auswählen

Schlüssel = ["Open", "High", "Low", "Adj Close", "Volume", "Dividends", "Stock Splits"]
Liste = []
Liste2 = []
Liste_DB = []
i = 0

for i in range(0,np.shape(Schlüssel)[0]):
    Liste.append(list(zip(list_of_tickers, [Schlüssel[i]]*len(list_of_tickers))))
    Liste2.append(stock_values_hist[Liste[i]])
    Liste_DB.append(np.array((df(Liste2[i]).reset_index()).to_numpy().tolist()))


Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das *muss* ein Troll sein… 😳
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

`np.shape(Schlüssel)[0]` ist das selbe wie `len(Schlüssel)` nur viel komplizierter geschrieben.
Über einen Index iteriert man aber nicht, weil man auch direkt über die Elemente iterieren kann.

Aber was willst Du denn jetzt mit den Daten machen? Warum willst Du unbedingt das schöne Dataframe in Listen packen?

Was ist list_of_tickers oder stock_values_hist?
Antworten