Seite 2 von 3

Verfasst: Sonntag 17. Mai 2009, 21:11
von yipyip
"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

Verfasst: Sonntag 17. Mai 2009, 21:17
von Dill
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?"

Verfasst: Sonntag 17. Mai 2009, 21:41
von gooogle
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 ;)

Verfasst: Sonntag 17. Mai 2009, 22:05
von yipyip
(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

Verfasst: Montag 18. Mai 2009, 07:18
von Dill
bei "34, 00, 78, 89, 01, 11, 88" sind also keine flags mehr dabei?
warum braucht es 7 byte dafür?

Verfasst: Montag 18. Mai 2009, 11:01
von gooogle
Hallo
Dill,
weil da noch mehr Infos drin stehen die mich nicht interessieren ausser dem speziellen ;)



Grüsse :)

Verfasst: Montag 18. Mai 2009, 12:57
von yipyip
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

Verfasst: Montag 18. Mai 2009, 21:47
von gooogle
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 ;)

Verfasst: Montag 18. Mai 2009, 23:21
von yipyip
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

Verfasst: Montag 18. Mai 2009, 23:44
von yipyip
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

Verfasst: Dienstag 19. Mai 2009, 14:34
von gooogle
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

Verfasst: Dienstag 19. Mai 2009, 18:40
von yipyip
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

Verfasst: Dienstag 19. Mai 2009, 21:07
von yipyip
...hier noch ein kleines Update:
http://paste.pocoo.org/show/118070/
:wink:
yipyip

Verfasst: Mittwoch 20. Mai 2009, 13:00
von gooogle
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?

Verfasst: Mittwoch 20. Mai 2009, 13:29
von yipyip
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

Verfasst: Donnerstag 21. Mai 2009, 13:25
von gooogle
Hallo yipyip

ich sitze gerade wieder an Python (learning by doing ;) ) und versuche mich gerade selbst an das Einfügen des Time stamps für die jeweiligen sequenzen bzw message markers.

Verfasst: Donnerstag 21. Mai 2009, 16:43
von yipyip
Zunächst:
1) Umlaute in den Kommentaren müssen nicht unbedingt sein,
sonst muss ich bei mir immer " -*- coding: utf-8 -*- " obendrüber schreiben. ;-)
2) Damit das Forum hier nicht vollständig zusammenbricht,
den Code lieber nach http://paste.pocoo.org/ auslagern
und hier verlinken.

Die Hauptfrage ist:
Wie sind die Timestamps mit Deinem Sequenzbuffer 'puffer' assoziiert?
Existiert für jeden Index i eine Zahl z aus 'puffer' und ein t aus 'Time'?
Oder hast Du eine Abbildung
{Indexmenge der Timestamps} -> {Indexmenge von 'puffer'}
die jedem Timestamp t(i) eine Zahl z(j) aus 'puffer' zuordnet?

Soweit ich das verstanden habe, sind die Timestamps doch nur
eine Zusatzinformation, die zum Schluss mitausgegeben werden soll, haben also in
'seq_to_lookupseq' nichts verloren.
(Deshalb habe ich das Ganze auch so organisiert wie in meinem
letzten Beispiel.)
Mit den Timestamps soll doch nicht gesucht werden?

Versuche noch mal, mein letztes Beispiel durchzugehen
und alles Neuartige mit kleinen Beispielen in der Pythonshell
nachzuvollziehen.
(Bei Deinem Code:
Wenn nix Sinnvolles bzw. Fehler bei rauskommen, kann das Alles
so nicht richtig sein...)
Also:
- Wie hängen die Timestamps mit der Sequenz zusammen?
- Python lernen !

:wink:
yipyip

Verfasst: Donnerstag 21. Mai 2009, 18:05
von yipyip
Deine Version "in funktionierend"
(aber nicht grossartig ausgetestet)
http://paste.pocoo.org/show/118396/
8)
yipyip

Verfasst: Donnerstag 21. Mai 2009, 19:28
von gooogle
Hallo yipyip

ja da hast du recht. der time stamp gehört nicht in der funktion.

also der time stamp wird nur für jeden marker rausgegeben, weil der marker angibt wann eine neue message/frame vorliegt.
der timestamp puffer wid parallel zum daten puffer gefüllt.
also immer wenn eine neue message vorliegt (Marker) wird die aktuelle Zeit im Time puffer gespeichert. beispiel:

time=[2, 8, 10]
puffer=[5, 999, 1,2,3,4,5, 999, 0,9, 999]

Also die puffer legen so in etwa vor und man braucht keinen timestamp von python aus definieren ;) einfach davon ausgehen dass beide puffer vorlegen.

nun möchte ich wie schon besprochen sowas realisieren:

time 2: (5) --> Relais aktiviert
time 8: (1,2,3,4,5) --> Relais deaktiviert
time 10: (0,9) --> Relais smells funny

Also für jeden Marker den Time stamp rausfiltern ;)
1. Marker --> 0-tes element aus time puffer
2. marker--> 1-tes element aus time puffer
usw ;)

Hoffe jetzt hat man mich verstanden?..drücke mich manchmal etwas schwierig aus ;)

Grüsse

Verfasst: Donnerstag 21. Mai 2009, 19:31
von gooogle
P.S.: Kennst du vielleicht einen besseren Editor als Python shell?

so einen wie bei C Programmierung, wo man den Code reinschreibt und am ende kompiliert bzw ausführt und das ergebnis bekommt? :)
so einen ditor müsste es doch auch geben oder?

Grüsse :wink: