Hallo,
ich habe unter C folgendes mehrdimensionale Array geschrieben:
1
uint8_tlichtsteuerung[14][8]={{1,0,1,0,1,0,1,0},
2
{0,1,0,1,0,1,0,1},
3
{1,1,0,0,1,0,1,0},
4
{1,0,1,1,0,1,1,0},
5
{0,1,0,1,0,1,0,1},
6
{1,0,1,0,1,0,1,1},
7
{0,1,0,0,1,1,0,0},
8
{1,0,1,1,0,0,1,1},
9
{0,1,0,1,0,1,1,0},
10
{1,0,1,0,1,1,0,1},
11
{1,1,0,1,1,0,1,0},
12
{0,1,0,0,0,1,1,1},
13
{1,0,1,1,1,0,0,0},
14
{0,1,0,1,0,1,0,1}
15
};
Im Forum passt jetzt die Einrückung der ersten Zeile nicht, in der
Entwicklungsumgebung passt es.
Jede Zeile steht für einen bestimmten Zeitpunkt, jede Spalte für eine
Lampe. Ich kann durch die tabellarische Ansicht schön Übersichtlich
meine Steuerung konfigurieren.
Jetzt möchte ich so ein Konstrukt unter Python erstellen.
Ich habe bisher folgendes gefunden:
Variante 1:
1
lichtsteuerung=[[1,0,1],[1,1,0],[0,0,0]]
Das ist allerdings sehr unübersichtlich, wenn alles in einer Zeile
steht. Bei der Variante oben stehen die Werte für eine Lampe immer
direkt untereinander, das ist viel besser.
Variante 2:
1
a=[1,0,1]
2
b=[1,1,0]
3
c=[0,0,0]
4
lichtsteuerung=[a,b,c]
Hier hätte ich die Werte einer Lampe wieder direkt untereinander, müsste
aber zum Schluss alle Listen zu einer "Gesamtliste" zusammenbauen. Bei
dem Beispiel sind es jetzt 3 Stück, können aber im Programm locker mal
so um die 100 werden. Und spätestens wenn bei einer Programmänderung
eine Zeile zwischen drin eingefügt werden muss wird es unübersichtlich.
Hat jemand eine Idee, wie man das in Python lösen kann? In C
funktioniert das ja wunderbar. Mein Codebeispiel ist aus einer Firmware
für einen Controller. Das Programm das ich jetzt machen möchte ist ein
Python Script für einen Raspberry, das unter anderem die RS232 und die
GPIOs steuert. Das möchte ich nicht unbedingt in C schreiben.
Sven B. schrieb:> Außerdem kannst du das auch mit Listen genauso hinschreiben wie in C:a => [> [1, 2, 3],> [4, 5, 6],> [7, 8, 9]> ]
vielleicht sollte der TO auch über tuple nachdenken die sind immutable
und ich nehme mal stark an das die inneren Listen/tuples sich nicht
ändern werden. Abgesehen davon sind die inneren Listen alle 8 Bytes groß
vielleicht ist es Sinnvoll, diese als Hexvalues zu speichern und
stattdessen nur mit einem eindimensionalen Array zu arbeiten. der
Converter von Hex zu Bits ist schnell geschrieben in Python zum Beispiel
Wenn man für diese Trivialaufgabe ein Python hochfährt, ist die
Performance vermutlich egal. Wenn sie es nicht ist, ist np.array
sicherlich mit Abstand die schnellste Variante, wie immer in Python.
Sven B. schrieb:> Wenn man für diese Trivialaufgabe ein Python hochfährt,
Dauert denn "Python hochfahren" länger als z.B. "gcc hochfahren"?
Was würdest du denn für diese Aufgabe "hochfahren"?
Sven B. schrieb:> Außerdem kannst du das auch mit Listen genauso hinschreiben wie in C:a => [> [1, 2, 3],> [4, 5, 6],> [7, 8, 9]> ]
Kleiner Hinweis: In der vorletzten Zeile darf und imho sollte man noch
ein Komma setzen, also:
1
[
2
[1, 2, 3],
3
[4, 5, 6],
4
[7, 8, 9],
5
]
Begründung aus PEP 3:
https://www.python.org/dev/peps/pep-0008/#when-to-use-trailing-commasImonbln schrieb:> vielleicht sollte der TO auch über tuple nachdenken die sind immutable> und ich nehme mal stark an das die inneren Listen/tuples sich nicht> ändern werden.
Ich sehe nicht, warum die Anzahl der Lampen nicht auch veränderlich sein
sollte, aber grundsätzlich bin ich bei diesem Einwand voll dabei: Es
macht wenig Sinn, den C-Code möglichst direkt in Python zu übersetzen.
Wenn man Python verwendet, sollte man auch die dort verfügbaren
Konstrukte verwenden, um den Sachverhalt zu modellieren. Die einzelne
Lampe über den Index zu identifizieren ist wenig "pythonic" und die
Zeitpunkte, für die diese Zustände stehen, an anderer Stelle zu halten,
wäre in jeder Sprache mit Objektorientierung mindestens ein wenig
seltsam.
Eine bessere Struktur könnten Dictionaries sein oder man macht gleich
eine eigene Klasse daraus.
Sven B. schrieb:> np.array
... mag performant sein. Es modelliert aber mit einiger Sicherheit nicht
den Sachverhalt, um den es hier geht.
Das Array ist nur mittel zum Zweck, da steht schon noch mehr dahinter.
Es wird auch nicht ein c Programm auf Python umgeschrieben. Ich hab den
c-Schnipsel nur aus einem anderen Programm rauskopiert um zu zeigen wie
ich es gerne hätte. Da ich ja beim Programmieren auch dazu lernen möchte
werde ich mir numpy mal anscheuen, habe ich bisher noch nichts von
gehört. Auch die schreibweise wie im c-beispiel werd ich nochmals
probieren, das gab bei mir eine Fehlermeldung. Versuche das aber
nochmals und poste ggf. dir Meldung.
R. F. schrieb:> Auch die schreibweise wie im c-beispiel werd ich nochmals> probieren, das gab bei mir eine Fehlermeldung. Versuche das aber> nochmals und poste ggf. dir Meldung.
Die Regeln für das Umbrechen von Programmzeilen sind in Python etwas
strenger als in C. Lies dir dazu auf der folgenden Webseite die
Abschnitte 2.1.5 und 2.1.6 durch:
https://docs.python.org/3/reference/lexical_analysis.html#explicit-line-joining
Le X. schrieb:> Sven B. schrieb:>> Wenn man für diese Trivialaufgabe ein Python hochfährt,>> Dauert denn "Python hochfahren" länger als z.B. "gcc hochfahren"?
Natürlich dauert es länger, ein Python-Programm zu starten, als ein
C-Programm. Ist das eine ernstgemeinte Frage? Hier ein Hello World:
Python 61.229.106 instructions:u
C++ 3.025.067 instructions:u
C 206.162 instructions:u
> Was würdest du denn für diese Aufgabe "hochfahren"?
Es ist schon ok, Python zu verwenden. Nur macht es keinen Sinn, bei
einem Array mit 5x11 Items die Performance zu optimieren mit
irgendwelchen Hex-Tricks. Das ist einfach absurd. Es liegt einfach nahe,
dass die Performance im vorliegenden Fall relativ egal ist, weshalb ich
die einfachste Lösung bevorzugen würde.
Und noch einmal, wenn Performance irgendeine Rolle spielt, ist
numpy.array die Lösung und nicht eine Liste von Tupeln mit Hexwerten.
Zudem ist numpy.array vermutlich sogar gleichzeitig die einfachste
Lösung.