Re: [Python-de] Array als Tabelle (mit Zeilen und Spalten)?

Hallo Mike, Am 24.11.2012 23:28, schrieb Mike Müller:
Am 24.11.12 22:31, schrieb Benedikt Schwarz:
== Frage == Wie bekommt man mehr als 2 Spalten bei Dictionaries?
Eine Lösung wäre sicher ein Dictionary mit Tupeln als Wert:
d = {'a': ('werta1', 'werta2'), 'b': ('wertb1', 'wertb2')}
ich wusste noch nicht, das man die auch verschachteln kann. Bis zu welchem Grad kann man Dictionaries, Listen, Tupeln, usw. ineinander verschachteln? Gibt es da eine Grenze?
Zugriff auf das gesamte Tupel:
d['a'] ('werta1', 'werta2')
Zugriff auf Werte im Tupel:
d['a'][0] 'werta1' d['a'][1] 'werta2'
Geht natürlich mit jedem Schüssel:
d['b'] ('wertb1', 'wertb2') d['b'][0] 'wertb1' d['b'][1] 'wertb2'
Eine Liste statt eines Tupels geht auch. Eine Liste lässt sich ändern:
L = [1, 2, 3] L [1, 2, 3] L[0] = 10 L [10, 2, 3]
Bei einem Tupel geht das nicht. Es muss dann immer ein neues Tupel sein, wenn sich ein Wert ändern soll. Es hängt also von deinem Anwendungsfall ab. Wenn es einmal Erstellen und dann Nur-Lese-Zugriff sein soll würde ich Tupel empfehlen. Wenn sich der Inhalt, also immer nur einer der Werte, immer wieder ändern soll ist sicher eine Liste besser.
Das Ganze ist natürlich nicht auf zwei Werte beschränkt. Die Anzahl der Werte bei jedem Schlüssel-Werte-Paar kann anders sein, wenn das für deine Anwendung Sinn macht.
Eine weitere Lösung wäre als Wert wieder ein Dictionary zu nehmen. Ob das für dich Sinn macht kann ich nicht abschätzen, da ich den Zweck deiner zwei Werte-Spalten nicht kenne.
Dann lasse ich mal die Katze aus dem Sack: Es geht um die Abkürzung von chemischen Elementen in der einen Spalte, den vollen Namen in einer weiteren Spalte, die Eigenschaften in der nächsten Spalte und zu guter Letzt die lateinische Ursprungsbezeichnung in der vierten Spalte. Dazu noch ein paar Berechnungen und das Ganze verpackt hinter einer Tkinter GUI. Bis demnächst Benedikt Schwarz

Hallo Benedikt, On 2012-11-25 01:15, Benedikt Schwarz wrote:
Am 24.11.2012 23:28, schrieb Mike Müller:
Am 24.11.12 22:31, schrieb Benedikt Schwarz:
== Frage == Wie bekommt man mehr als 2 Spalten bei Dictionaries?
Eine Lösung wäre sicher ein Dictionary mit Tupeln als Wert:
d = {'a': ('werta1', 'werta2'), 'b': ('wertb1', 'wertb2')}
ich wusste noch nicht, das man die auch verschachteln kann.
Bis zu welchem Grad kann man Dictionaries, Listen, Tupeln, usw. ineinander verschachteln? Gibt es da eine Grenze?
soweit ich weiß, nicht. Aber bei mehr als zwei Ebenen wird es ohnehin recht unübersichtlich.
Dann lasse ich mal die Katze aus dem Sack: Es geht um die Abkürzung von chemischen Elementen in der einen Spalte, den vollen Namen in einer weiteren Spalte, die Eigenschaften in der nächsten Spalte und zu guter Letzt die lateinische Ursprungsbezeichnung in der vierten Spalte.
Dazu noch ein paar Berechnungen und das Ganze verpackt hinter einer Tkinter GUI.
Was wäre denn dann der Schlüssel (Key) des Dictionarys? Statt der Tupel oder Listen würde ich hier eine Klasse für die Eigenschaften benutzen: # Don't use just `Element` since this is used for so many # other things. class ChemicalElement(object): def __init__(self, symbol, molar_mass, latin_name=None): self.symbol = symbol # Molar mass in g/mol self.molar_mass = molar_mass self.latin_name = latin_name iron = ChemicalElement(u"Fe", 55.85, u"Ferrum") print iron.symbol # -> Fe print iron.molar_mass # -> 55.85 print iron.latin_name # -> Ferrum Nebenbei siehst du dabei noch den wichtigen Hinweis, bei physikalischen Eigenschaften immer die Einheit zu kommentieren. :-) Ich habe vor Urzeiten für die Simulation eines chemischen Reaktors (damals noch in C++) Code geschrieben, der so etwas erlaubte: H2 = Substance(...) O2 = Substance(...) H2_O = Substance(...) oxidation = Reaction(2 * H2 + O2 == 2 * H2_O) Das kann man auch in Python machen. :-) Viele Grüße Stefan

Am Sonntag, 25. November 2012, 10:37:38 schrieb Stefan Schwarzer:
Was wäre denn dann der Schlüssel (Key) des Dictionarys?
Statt der Tupel oder Listen würde ich hier eine Klasse für die Eigenschaften benutzen:
oder collections.namedtuple? http://docs.python.org/2/library/collections.html#collections.namedtuple Hat da jemand Praxiserfahrung mit, lohnt sich der Einsatz? VG, Achim. -- Achim Herwig <python@wodca.de>

Hallo Achim, On 2012-11-25 10:44, Achim Herwig wrote:
Am Sonntag, 25. November 2012, 10:37:38 schrieb Stefan Schwarzer:
Statt der Tupel oder Listen würde ich hier eine Klasse für die Eigenschaften benutzen:
oder collections.namedtuple? http://docs.python.org/2/library/collections.html#collections.namedtuple
Hat da jemand Praxiserfahrung mit, lohnt sich der Einsatz?
ich habe bisher `namedtuple` sehr selten genutzt. Ich finde es nicht sinnvoll, Objekten "mal eben nebenbei" eine Tupel-Schnittstelle zu verpassen, nur weil es sich einfach hinschreiben lässt (vgl. [1]). Im konkreten Beispiel der chemischen Elemente fände ich es überhaupt nicht intuitiv, auf Attribute über Indizes zuzugreifen wie in print iron[0] # -> Fe print iron[1] # -> 55.85 und würde diese Schnittstelle daher auch nicht anbieten. `namedtuple` bietet sich meiner Meinung nach eher bei Objekten an, die schon im "normalen Leben" üblicherweise als Tupel dargestellt werden, zum Beispiel 2D- oder 3D-Koordinaten. Was ich nett fände, wäre eine Collection-Klasse in der Standardbibliothek, die einfache Klassen ohne Methoden ermöglicht, aber ohne die Indizierungsmöglichkeiten von `namedtuple` hinzuzufügen. (Ja, ich weiß, dass eine solche Klasse relativ einfach selbst zu schreiben ist.) Ich denke, das wäre in vielen Situationen sinnvoller, wo jetzt mancher der Bequemlichkeit halber `namedtuple` verwendet, weil es die Python-Standardbibliothek anbietet. [1] http://mail.python.org/pipermail/python-de/2011q2/001547.html Viele Grüße Stefan
participants (3)
-
Achim Herwig
-
Benedikt Schwarz
-
Stefan Schwarzer