@sausage: Dein erster an mich gerichteter Satz klingt wie eine Begründung, ich weiss nur nicht für *was* eigentlich‽
Die Grafik zu `data` ist etwas inkonsistent. Oben steht das es sich um eine Liste handelt, in der ersten Ebene steht dann aber „Dictionary” als Typ‽ Und dann passt es nicht zum Text wo steht das drei der Werte jeweils eine Liste mit einem Array mit 420 Zahlen sind. Das sehe ich in der Zeichnung nicht? Das wäre auch wie schon gesagt eine unsinnige Datenstruktur. Man will keine Listen haben die grundsätzlich nur ein Element enthalten. In Zeile 7-10 scheinst Du da dann *noch* eine weitere Liste da drum herum zu basteln. Kommt da etwa die dreidimensionale Struktur her? Weil Du statt eine unnötige Verschachteltung zu *entfernen* das *noch mal* unnötig ”verpackst”?
Im Code steht im Kommentar das es 20 Wörterbücher sind, wo im Text und in der Zeichnung steht es wären 10‽
Schritt 2 ist unnötig umständlich denn ein Slice der Länge 1 hätte man auch einfach mit einem normalen Indexzugriff ausdrücken können. Durchnummerieren von Namen ist aber eine schlechte Idee, denn dann will man in der Regel eigentlich eine Datenstruktur dafür verwenden, zum Beispiel eine Liste. Und hey, die hast Du ja schon. Also warum das an der Stelle auf vier Namen verteilen?
Namen sollte man erst binden wenn man sie auch tatsächlich braucht. Nicht am Anfang ”deklarieren”. Das macht das Programm unübersichtlicher weil Teile die eigentlich zusammengehören so über das gesamte Programm verteilt werden. `temp` sollte gar nicht ”initialsiert” werden, denn der ganz am Anfang zugewiesene Wert wird nirgends verwendet. Und die Verwendung des Namens ist auch fragwürdig — man muss nicht jedes Zwischenergebnis an einen Namen binden. Zumal das hier auch gar keinen Sinn ergibt, denn das scheint ja eine der Listen zu sein, die überflüssig sind.
Ich sehe hier auch das Problem das man gar nicht weiss welcher Wert an welchen Namen gebunden wird, weil Wörterbücher keine Ordnung haben. `itervalues()` liefert die Werte in *irgendeiner* Reihenfolge. Und da zumindest einer anders aussieht als die anderen, kann es passieren das an `elem1` am Ende gar nicht die 420 Werte gebunden werden, sondern der Wert von dem Schlüssel vom Typ Zeichenkette. An der Stelle ist das Programm also fehlerhaft.
Die Werte in ein Numpy-Array umzuwandeln macht nur Sinn wenn man dann auch die Operationen eines solchen Arrays verwendet. Wenn Du da einfach eine ``for``-Schleife in Python drüberlaufen lässt, dann hättest Du es auch als Liste belassen können, beziehungsweise wenn das in `data` in dem Wörterbuch ein Arraytyp ist, dann nimm *das* Array und verpack das nicht in zwei Listen um *das* dann in ein ”3D-Array” umzuwandeln. Ich versuche dafür gerade etwas milderes als „hochgradig schwachsinnig” zu finden — klappt irgendwie nicht.
Zur Ausnahme: Die sollte bei genauem hinsehen eigentlich klar sein. Du versuchst da `elem1` aufzurufen — was nicht geht, weil man Listen nicht aufrufen kann, aber soweit kommt es erst gar nicht — und der Ausdruck für das Argument beim Aufruf lautet ``[0][0]
``. Dabei ist völlig egal was `i` hier für einen Wert hat:
Code: Alles auswählen
In [3]: i = 'irgendwas'
In [4]: [0][0][i]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-409e2b88323c> in <module>()
----> 1 [0][0][i]
TypeError: 'int' object has no attribute '__getitem__'
Schauen wir uns mal an was die einzelnen Teilausdrücke bedeuten:
Code: Alles auswählen
In [5]: [0]
Out[5]: [0]
In [6]: [0][0]
Out[6]: 0
In [7]: 0[i]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-a8e76ecf3d12> in <module>()
----> 1 0[i]
TypeError: 'int' object has no attribute '__getitem__'
[5]: Eine Liste mit einer 0 als einzigem Element.
[6]: Aus der Liste wird das Element an Index 0 geholt, also eine 0.
[7]: Der Versuch einen Indexzugriff auf einer ganzen Zahl durchzuführen. Das geht nicht.
Als allererstes solltest Du klären warum die Werte in `data` in einer unnötigen Liste stecken — wenn ich mir die Zeilen 7—10 anschaue könntest Du das selber gemacht haben — und das dann wenn möglich *abstellen*. Auf jeden Fall solltest Du das das unsinnige zweite verpacken durch ein ”auspacken” ersetzen.
Und dann müsstest Du mal klären welchen Wert Du eigentlich an `elem1` binden möchtest, denn momentan ist das ein zufälliger von den vier Werten.