In Python Array auslesen und interpretieren?

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.
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

hallo

coole sache yipyip...danke dir. werd ich ausprobieren :)

grüsse
fff gh
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@yipyip:

self.state ^= 1 solltest du besser mit Wahrheitswerten und self.state = not self.state umsetzen.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Klar, bei nur 2 Zuständen reichen boolsche Werte aus.
Ich denke bei diesen Problemstellungen immer an
endliche Automaten, deshalb habe ich mir die Anzahl der Zustände
zunächst offengelassen und deshalb Integer-Werte verwendet.

:wink:
yipyip
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

warum ist denn der code für "relais aktiviert" so lang?
sicher dass da nicht noch einiges an balast bei ist? (ack, seq, crc, ...)
http://www.kinderpornos.info
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

Hallo Dill

ja, da ist auch balast dabei aber dieser ist für meine anwendung uninteressant ;) ich möchte einfach später nur den kurzen Text "Relais wurde aktiviert" sehen.
Zuletzt geändert von gooogle am Samstag 6. März 2010, 17:46, insgesamt 1-mal geändert.
fff gh
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

"lookup_seq" ist ein selbstdefinerte Variable:

Code: Alles auswählen

In [2]: a, b, c = [1, 2, 3]

In [3]: lookup_seq = a, c 

In [4]: lookup_seq
Out[4]: (1, 3)
Bei numerix könntest Du nach Zeile 8 schreiben

Code: Alles auswählen

a, b, c = seq
lookup_seq = a, c
if lookup_seq in events:
....
oder auch gleich direkt:

Code: Alles auswählen

if ((seq[0], seq[2])) in events:
...
(Ist mein Code so unverständlich? .... :cry: ...)
:wink:
yipyip
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

also mal angenommen ein frame is so aufgebaut:

[startflag, ack, seq, data, crc, endflag]

und data kann die werte 1, 2, 3 annehmen.

dann willst du ernsthaft data folgendermaßen verarbeiten:

Code: Alles auswählen

if frame == [startflag, ack, seq, 1, crc, endflag]: (...)
elif frame == [startflag, ack, seq, 2, crc, endflag]: (...)
elif frame == [startflag, ack, seq, 3, crc, endflag]: (...)
else: print "w0t?"
http://www.kinderpornos.info
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

yipyip

danke :) nein dein code ist übersichtlich aber ich wollte es erstmal ohne Klassen versuchen ;) wie gesagt bin noch amateur in diesem gebiet. habe bislang nur in C programmiert und python für mich noch etwas ungewohnt.

habe versucht beide versionen unter python auszuführen aber erhalte kein ergebnis. gibt es einen trick? oder verwende ich den falschn pyhton editor (Python 3.0 IDLE (GUI))?

Dill

nee..was in den puffer geladen wird, sind nur die daten und die kennezeichnung eines frame anfangs bzw ende ;)
fff gh
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

(Arrgh... grad wollte ich die Antwort abschicken, kommt ein
"Failed to connect"...)

Also bei mir mit Python 2.5 funktionierts, auch in Idle
erscheint die stdout-Ausgabe in der Python-Shell.
Mit 3.x habe ich mich noch nicht beschäftigt,
vielleicht reicht es ja, die print-Befehle anzupassen.
:wink:
yipyip
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

bei "34, 00, 78, 89, 01, 11, 88" sind also keine flags mehr dabei?
warum braucht es 7 byte dafür?
http://www.kinderpornos.info
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

Hallo
Dill,
weil da noch mehr Infos drin stehen die mich nicht interessieren ausser dem speziellen ;)



Grüsse :)
Zuletzt geändert von gooogle am Samstag 6. März 2010, 17:47, insgesamt 1-mal geändert.
fff gh
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Ok, das mit dem

Code: Alles auswählen

a, b, c = seq
hat Dich etwas auf die falsche Fährte geführt.
(mein Fehler, wollte nur ein einfaches, allgemeines Beispiel geben).

Die Sequenzen können ja beliebige Länge haben.
Im obigen Fall muss die Sequenz aber genau 3 Elemente besitzen.

Deshalb hier noch etwas Experimentiercode, abgeleitet von
numerix' Beispiel:

http://paste.pocoo.org/show/117815/

:wink:
yipyip
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

Hallo yipyip

sitze gerade vor dem code und versuche es nachzuvollziehen. ich habe mal den code mit komentaren versehen, damit du siehst ob ich es richtig verstanden gabe ;)
Zuletzt geändert von gooogle am Samstag 6. März 2010, 17:47, insgesamt 1-mal geändert.
fff gh
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Habe das jetzt so verstanden, dass Du die Indizes und
deren Anzahl flexibel halten möchtest.

Dann musst Du eben die zu untersuchenden Indizes definieren
und eine Funktion schreiben, die mit deren Hilfe die Sequenz auf
eine Liste der benötigten "lookup-Sequenzen" abbildet.

Habe das hier ziemlich zusammengehackt, hoffe, es
reicht als weiterer Ausgangspunkt.

http://paste.pocoo.org/show/117925/

:wink:
yipyip
Zuletzt geändert von yipyip am Dienstag 19. Mai 2009, 00:25, insgesamt 2-mal geändert.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Was genau muss ich ändern, um auch grössere elemente zu analysieren:
Du konntest schon immer längere Sequenzen analysieren.
Nur bei

Code: Alles auswählen

lookup_seq = seq[0], seq[2]
muss die Sequenz mindestens die Länge 3 haben,
da sonst "seq[2]" einen IndexError auswirft.
Es hängt nur davon ab, welchen maximalen Index
Du für die lookup-Sequenz verwenden willst.
Ist dieser zu gross, kann die zu untersuchende Sequenz sofort verworfen werden.

:wink:
yipyip
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

Hallo yipyip,

Ich hab es mal ausprobiert und es funktioniert soweit ganz gut :)
Allerdings wenn man sich den Output ansieht, so sieht man dass beide Tuple Listen angezeigt werden, z.B. (8, 2, 0, 6, 77) (8, 2, 0, 6) . ich bräuchte aber nur das erstere immer, also z.B. (8, 2, 0, 6, 77) --> 144.3 --> Relais on
Zuletzt geändert von gooogle am Samstag 6. März 2010, 17:47, insgesamt 1-mal geändert.
fff gh
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Das Problem ist nicht die Ausgabe
(da muss man doch nur die print-Befehle richtig schreiben),
sondern die Tatsache, dass Dein 'Time'
mit dem event-Dictionary verknüpft ist.
Es sollte aber nur zum 'puffer' gehören.

Der Einfachheit halber habe ich jetzt angenommen,
dass jede Zahl in 'puffer' mit einem Timestamp versehen ist.
Für die Zeit einer Ereignismeldung wird der Timestamp des Markers verwendet.
(Wie das genau bei Dir aussieht und wie Du das anpassen
musst, sei erstmal dahingestellt.)

In 'etwas schöner':
http://paste.pocoo.org/show/118031/

Bücher/Doku? ...gibts doch genug:
Original Doku, Learning Python, Programming Python,
Core Python, A Byte of Python, Dive into Python, ...
...entweder im Internet oder in der Uni-Bib Deines Vertrauens.

:wink:
yipyip
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

...hier noch ein kleines Update:
http://paste.pocoo.org/show/118070/
:wink:
yipyip
gooogle
User
Beiträge: 66
Registriert: Freitag 15. Mai 2009, 19:13
Wohnort: burghausen

Hallo yipyip

danke dir :) muss mich etwas sammeln, soviele Funktionen und neue Varianten...da muss man sich erst etwas dran gewöhnen ;)

eine frage noch, was genau bedeutet dies:

return [s for s in result if s]

im kommentar steht dass es leere listen rauswirft, aber wie das genau gemacht wird ist mir ein rätsel. komme mit dem s for s in result if s nicht klar :( heisst das dass eine forschleife erzeugt wird die das result[] durchkämmt und alles was s, also Listen, sind zurückgibt?
fff gh
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Das ganze nennt sich "List Comprehension" und ist an die
mathematische Mengennotation angelehnt.
Erster Anlaufpunkt:
http://docs.python.org/tutorial/datastr ... rehensions

In diesem Fall bedeutet das:
Erzeuge eine Liste mit Objekten s aus result,
wobei bool(s) == True gelten soll.
Falls s == [] (die leere Liste), dann hat s den Wahrheitswert 'False',
wird also nicht mit aufgenommen.
Somit werden in unserem Fall nur die Listen gesammelt,
die nicht leer sind und leere Listen (die aufgrund der Schleifenlogik vorkommen können) aussortiert.

:wink:
yipyip
Antworten