Dynamischer Vektor

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.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Ingo hat geschrieben:Das habe ich auch alles probiert. nur das das rauskommt:
0
1
2
3
4
5
6
7
8
9
4,875
der wert 4,875 ist mein messwert der rest nicht. woran kann das nur liegen?
Du hast eine Liste mit range(10) erzeugt and dann 4,875 als elftes Element drangehängt.

Ich hab auch nicht wirklich eine Ahnung, was du tun willst ... die Liste soll immer 100 Elemente haben und bei Bedarf die ältesten (die obersten) rauswerfen?
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

ich vermute auch mal das liegt am Quellcode :roll:

vielleicht solltest du deinen Versuch hier mal posten - evtl erbarmt sich noch jemand und hilft dir.

[edit]
... aber ich schmeiss mich in die Ecke wenn das der Fehler ist den ich gerade vermute ...
[/edit]
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Ich rate einfach weiter ... was Du tun kannst ist immer weiter anhängen, und bei jedem Durchlauf die Länge der Liste abfragen.

Code: Alles auswählen

...

dyn_vektor.append(dein_messwert)

...

if len(dyn_vektor) == 101:
        dyn_vektor = dyn_vektor[1:101]

...
Damit wird der älteste Wert (Index 0) weggeschmissen und die Liste ist wieder 100 Elemente lang.
BlackJack

Für den Fall wäre wohl eine `collections.deque` eine bessere Wahl. Natürlich am besten in eine eigene Klasse verpackt.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Lässt sich da die Länge fixieren?
BlackJack

Nein, deswegen ja die eigene Klasse. Ungetestet:

Code: Alles auswählen

class BoundedQueue(object):
    def __init__(self, max_length):
        self.max_length = max_length
        self.data = collections.deque()
    
    def __len__(self):
        return len(self.data)
    
    def __iter__(self):
        return iter(self.data)
    
    def append(self, value):
        self.data.append(value)
        if len(self) > self.max_length:
            self.data.popleft()
abgdf

Ich glaube, der OP kommt aus der C-Welt und kann sich einfach nicht vorstellen, daß die Dinge so einfach sein können, wie Python sie macht.
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Also ich habe eine schleife in der zuerst nach einem messwert gefragt wird. ich bekomme den messwert. dieser messwert wird in der tabelle angezeigt. die schleife ist nun zu ende. sie beginnt von vorne und fragt wieder nach dem messwert ich bekommen den messwert dieser soll in einer neuen zeile angezeigt werden. der vorherige messwert ist eine zeile oben drüber. ich bestimme wie oft die schleife durchläuft und bestimme dadurch die anzahl meiner messwerte. aber wie kann ich immer den aktuellsten messwert in die neue zeile bringen?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@Ingo:
Einige sehr bemühte Menschen raten hier um die Wette, was genau dein Problem ist, warum es nicht so funktioniert, wie du es gerne hättest und geben dir hilfreiche Tipps.

Warum zeigst du nicht einfach mal den Code, der das machen soll, was du gerne hättest, aber es nicht tut. Dann wäre das Problem wahrscheinlich ruckzuck gelöst!
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Du solltest wirklich versuchen dein Problem vernünftig zu formulieren.

Du kannst neue Messwerte mit "append" anhängen. Eigentlich genauso wie in deinem "[0,1,2,3,4,5,6,7,8,9,4.875]"-Beispiel. Was passt dir daran nicht?

Leere Listen erzeugst mit

Code: Alles auswählen

dyn_vektor = list()
Mit Nullen gefüllt und 100 Elemente lang: z.B.:

Code: Alles auswählen

dyn_vektor = [0] * 100
abgdf

Hallo,

erstmal noch etwas zum Hintergrund bzgl. "dynamischer Vektoren":

In C und C++ muß man den Speicher selbst verwalten.
Statische, also unveränderbare Arrays (Felder, Vektoren) (vergleichbar Python-Tuplen (die erstmal nur ganze Zahlen enthalten, bei Strings wird's schon wieder schwieriger)), sind dabei nicht so problematisch, weil ihr Speicherbedarf bei Deklaration, bzw. Initialisierung bekannt ist.
Wenn man an eine dynamische Liste etwas anhängt, verändert sich aber ihr Speicherbedarf. Das muß der C/C++-Programmierer berücksichtigen, oder es entstehen Speicherlecks usw..
Es gibt mehrere Möglichkeiten, dynamische Listen in C/C++ zu programmieren. Je nachdem können z.B. Suchoperationen in verschiedenen Listentypen schneller oder langsamer sein usw..
In der "Standard Template Library" (STL) von C++ gibt es z.B. die Listentypen "vector", "deque" und "list":

http://www.c-plusplus.de/forum/viewtopi ... 43816.html

Soweit ich weiß, gibt es in C so ein praktische Standardbibliothek für Listen nicht. Offenbar wird erwartet, daß der Programmierer sie selbst implementiert. Immerhin gibt es hier

http://freshmeat.net/projects/libhx/

eine C-Bibliothek, die sich daran versucht.

In Python wird die Implementation der Listen vom Programmierer absichtlich ferngehalten. Diese Ebene ist bereits im Python-Interpreter fertiggestellt.
Das ist einer der wesentlichen Gründe, warum die Programmierung mit Python im Verhältnis so schnell und angenehm ist.
Dies ist jedoch auch einer der Gründe, warum Python-Code in der Regel insgesamt etwas langsamer abläuft als C-Code.

Viele Grüße
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

abgdf hat geschrieben:Soweit ich weiß, gibt es in C so ein praktische Standardbibliothek für Listen nicht. Offenbar wird erwartet, daß der Programmierer sie selbst implementiert. Immerhin gibt es hier

http://freshmeat.net/projects/libhx/

eine C-Bibliothek, die sich daran versucht.
Nunja, ganz so schlimm ist es nicht, denn mit der GLib gibt es durchaus eine Library für C die einem lästige Dinge abnimmt. Wenn man bedenkt, dass Programme wie irssi dasnutzen und GLib die Grundlage von GTK+ ist (und auch eigentlich von dort stammt), welches von vielen, vielen Programmen genutzt wird dann kann man durchaus von "populär" sprechen. Wer mehr Syntaktischen Zucker braucht, kann sich an dieser Stelle auch Vala ansehen, eine Sprache die zu C+GLib (GObject) kompiliert wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

BlackJack hat geschrieben:Für den Fall wäre wohl eine `collections.deque` eine bessere Wahl. Natürlich am besten in eine eigene Klasse verpackt.
ichbinsisyphos hat geschrieben:Lässt sich da die Länge fixieren?
BlackJack hat geschrieben:Nein, deswegen ja die eigene Klasse.
Mir spuckt die Doku diese Signatur aus: ``collections.deque([iterable[, maxlen]])`` - reicht das nicht?
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Ingo hat geschrieben:Also ich habe eine schleife in der zuerst nach einem messwert gefragt wird. ich bekomme den messwert. dieser messwert wird in der tabelle angezeigt. die schleife ist nun zu ende. sie beginnt von vorne und fragt wieder nach dem messwert ich bekommen den messwert dieser soll in einer neuen zeile angezeigt werden. der vorherige messwert ist eine zeile oben drüber. ich bestimme wie oft die schleife durchläuft und bestimme dadurch die anzahl meiner messwerte. aber wie kann ich immer den aktuellsten messwert in die neue zeile bringen?
Sag uns doch mal, was du mit Tabelle, anzeigen und neuer Zeile meinst.

Redest du da von Datenstrukturen wie einer Liste oder von der print-ausgabe, etc.? Willst du die Daten konservieren oder nur anzeigen?
BlackJack

@Y0Gi:

Code: Alles auswählen

In [284]: collections.deque([], 10)
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: deque expected at most 1 arguments, got 2
Muss dann wohl in 2.6 neu sein.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ja:

Code: Alles auswählen

Changed in version 2.6: Added maxlen parameter.
MfG
HWK
abgdf

@Leonidas: Aha, mit Glib geht das :idea:. Soweit bin ich eben nicht in C vorgedrungen. Ist mir halt zu anstrengend, wenn man einfach

Code: Alles auswählen

a = [1, 2, 3]
haben kann.

@Ingo:
Also ich habe eine schleife in der zuerst nach einem messwert gefragt wird. ich bekomme den messwert.
Woher ?
dieser messwert wird in der tabelle angezeigt.
In welcher Tabelle ? Excel ?
die schleife ist nun zu ende. sie beginnt von vorne und fragt wieder nach dem messwert
Wen ?
ich bekommen den messwert
Woher ?
dieser soll in einer neuen zeile angezeigt werden. der vorherige messwert ist eine zeile oben drüber.
Was für eine Zeile ? Eine Terminal-Zeile ? Eine Excel-Tabellenzeile ?
ich bestimme wie oft die schleife durchläuft und bestimme dadurch die anzahl meiner messwerte.
Wie ?
aber wie kann ich immer den aktuellsten messwert in die neue zeile bringen?
Das hängt davon ab, was es für eine Zeile ist: Bei einer Ausgabe im Terminal geht das anders als bei einem Eintrag in eine Excel-Tabelle.

Gruß
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Guten morgen zusammen
ich möchte meine liste mit meinen messwerten füllen und nicht mit irgendwelchen zahlen. das ist mein problem.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

na, wie dir schon mehrere geschrieben haben - poste deinen momentanen code, da wird dir schon wer helfen. Aber einfach raten ist verdammt schwierig. Liest du den überhaupt nicht was dir hier alles geantwortet wird?
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Doch natürlich lese ich die antworten.
ich habe mein fehler gefunden. danke für euere mühe. tut mir leid das dass so lange gedauert hat. bin manchmal schwer von begriff
Antworten