Seite 1 von 2

variable = [feldgröße] - wie lösen?

Verfasst: Donnerstag 26. Juni 2008, 21:11
von Lock on
Hallo liebe Communiy!

Bisher habe ich immer in C++ und Java programmiert und dort gibt es sogenannte Arrays.
So lässt sich bereits vor dem "füllen" des Arrays mit Daten die Größe des Arrays bestimmen.

Nun mag man mich für blöd halten oder für total "beschrubbt", aber ich krieg sowas nicht in Python hin.

Schreib ich

Code: Alles auswählen

variable = []
variable[0]= 1
variable[1]= 2
...
... dann kann ich die einzelnen Felder nicht auswählen und "füllen".

Oder anders ausgedrückt:
Wie kann ich eine Liste erstellen, wo erst zur Laufzeit bekannt wird, wie groß sie wirklich ist. Was auch nett zu wissen wäre, wie ich dann auf die einzelnen Felder zugreife.

Beispiel:
Ich hab eine Menge C, in die ich per Abfrage nach und nach eine Anzahl Elemente X eintragen lassen möchte.

Wie lös ich das in Python?

Lock on

PS: Google und Suchfunktion haben nicht weitergeholfen.

Verfasst: Donnerstag 26. Juni 2008, 21:14
von DasIch
Wieso willst du die Größe einer Liste bestimmen? Ich glaube was du suchst ist .append()

Code: Alles auswählen

meine_liste = []
meine_liste.append('bla')

Re: variable = [feldgröße] - wie lösen?

Verfasst: Donnerstag 26. Juni 2008, 21:15
von Hyperion
Lock on hat geschrieben: PS: Google und Suchfunktion haben nicht weitergeholfen.
Dann guck mal ins Tutorial ;-)

Verfasst: Donnerstag 26. Juni 2008, 21:27
von lunar
Mein Gott, hast du wirklich niemals std::vector oder ArrayList genutzt? :shock:

Verfasst: Donnerstag 26. Juni 2008, 22:22
von cofi
Für die Länge der Listen gibt es das len()-Builtin. Aber was du wohl suchst ist die .append()-Methode der Liste, wie DasIch schon schrieb.

Listen sind veränderbar, d.h. du kannst sie tatsächlich über die Indices ändern. Wie du auf die Felder zugreifst? Du iterierst über sie per

Code: Alles auswählen

for entry in array: dofoo()
Ich möchte aber mal erwähnen, dass du in deiner Frage ein paar Sachen durcheinander wirfst ;) Aber um dein Beispiel zu lösen ist .append() geeignet.

Und ein Blick ins Tutorial ist wirklich empfehlenswert ;)

Verfasst: Donnerstag 26. Juni 2008, 22:48
von Lock on
okay.. habs jetzt mittlerweile gefunden...

dafür kapier ich gerade eine andere Sache nicht...

Code: Alles auswählen

elemente = []

def prepare():
    kennung_menge = raw_input("Bezeichnung der Menge: ")
    anzahl_elemente = input("Anzahl Elemente: ")

    print "------------"

    for i in range(0, anzahl_elemente, 1):
        id = i + 1
        print "Element %d = " % id,
        
        elemente.append(input())

    print kennung_menge, " = {",

    if anzahl_elemente < 2:
        print elemente[0], "}"
        
    else:
        R = 0
        for R in range(1 ,anzahl_elemente, 1):
            select = R - 1
            print elemente[select],", ",
        
        print elemente[R],
        print "}"


prepare();
dann lautet die Ausgabe wie folgt:

Code: Alles auswählen

Bezeichnung der Menge: F
Anzahl Elemente: 10
------------
Element 1 =  10
Element 2 =  9
Element 3 =  8
Element 4 =  7
Element 5 =  6
Element 6 =  5
Element 7 =  4
Element 8 =  3
Element 9 =  2
Element 10 =  1
F  = { 5 ,  4 ,  3 ,  2 ,  1 ,  10 ,  9 ,  8 ,  7 ,  6 }
Ich verstehe nicht, wieso plötzlich in der Mitte angefangen wird zu zählen...

Verfasst: Donnerstag 26. Juni 2008, 23:08
von Rebecca
Ich hab deinen Code jetzt nicht versucht zu verstehen, er sieht total kompliziert aus. So geht's einfacher und ohne globale Variablen:

Code: Alles auswählen

def prepare():
    elemente = []
    kennung_menge = raw_input("Bezeichnung der Menge: ")
    anzahl_elemente = int(raw_input("Anzahl Elemente: "))

    print "------------"

    for i in range(anzahl_elemente):
        elem = int(raw_input("Element %i = " % (i+1)))
        elemente.append(elem)

    print elemente
    return elemente

elemente = prepare()

Wenn du die Ausgabe unbeding selbst implementieren willst:

Code: Alles auswählen

    print "{",
    for elem in elemente[:-1]:
        print elem, ", ",

    try:
        print "%i }" % elemente[-1]
    except IndexError: # menge ist leer
       print "}"

    return elemente
Wenn du wirklich Mengen haben willst, gibt's auch den eingebauten Datentyp Set. Da sind die Elemente allerdings nicht fest geordnet.

Verfasst: Freitag 27. Juni 2008, 05:27
von Zap
Kleiner Verbesserungsvorschlag um das Ergebnis auszugeben

Code: Alles auswählen

In [5]: elemente = range(10)

In [6]: print "F = { %s }" % ", ".join(map(str, elemente))
F = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

Verfasst: Freitag 27. Juni 2008, 07:32
von Darii
Lock on hat geschrieben:Ich verstehe nicht, wieso plötzlich in der Mitte angefangen wird zu zählen...
Keine Ahnung, bei mir funktioniert’s nämlich. Wie rufst du dein Programm auf? Benutzt du IDLE o.Ä.?

Verfasst: Freitag 27. Juni 2008, 08:07
von numerix
Lock on hat geschrieben:Ich verstehe nicht, wieso plötzlich in der Mitte angefangen wird zu zählen...
Ich kann das ebenfalls so nicht reproduzieren. Bei mir läuft es "normal".

Verfasst: Freitag 27. Juni 2008, 08:36
von Rebecca
Zap hat geschrieben:Kleiner Verbesserungsvorschlag um das Ergebnis auszugeben
Bild
War schon spaet gestern...

Verfasst: Freitag 27. Juni 2008, 08:47
von Zap
Ich kanns nachvollziehen (ätsch) :P

Der op hat uns vorenthalten das er die Methode zwei mal durchgespielt und sich somit die Liste durch den 2. Aufruf erweitert hat.

Das ist das Problem wenn man:
1. In einer Methode ein globales modifizierbares object ändert.
2. Die Iteration mit eigenen Grenzen durchführt. (hier ganz schlimm: da vom User vorgegeben)

Code: Alles auswählen

:prepare();
:--
Bezeichnung der Menge: A
Anzahl Elemente: 5
------------
Element 1 =  5
Element 2 =  4
Element 3 =  3
Element 4 =  2
Element 5 =  1
A  = { 5 ,  4 ,  3 ,  2 ,  1 }

In [2]: prepare()
Bezeichnung der Menge: B
Anzahl Elemente: 10
------------
Element 1 =  10
Element 2 =  9
Element 3 =  8
Element 4 =  7
Element 5 =  6
Element 6 =  5
Element 7 =  4
Element 8 =  3
Element 9 =  2
Element 10 =  1
B  = { 5 ,  4 ,  3 ,  2 ,  1 ,  10 ,  9 ,  8 ,  7 ,  6 }

Verfasst: Freitag 27. Juni 2008, 09:04
von Lock on
Ahhhh, jetzt leuchtet mir das ein! Ich bin davon ausgegangen, das bei jedem Neustart des Skripts die Liste bei NULL anfängt, somit leer ist.

Ich benutze IDLE. (würde gerne eric4 nehmen, aber wie in der Tutorial-Section beschrieben wills nicht so klappen)

Danke für die Tipps. Muss erstmal mit der Sprache warm werden. Hab da Muster in meinen Kopf, die bei Python einfach überflüssig sind.
Begeistert bin ich allerdings, weil die Sprache eine vernünftige Struktur hat(im Gegensatz zu Perl(noch was für euren Vergleichsthread)).

Vielen Dank euch allen! :D

Verfasst: Freitag 27. Juni 2008, 09:33
von Leonidas
Lock on hat geschrieben:Ahhhh, jetzt leuchtet mir das ein! Ich bin davon ausgegangen, das bei jedem Neustart des Skripts die Liste bei NULL anfängt, somit leer ist.
Die Liste ist auch bei jedem Neustart leer, nur startest du das Programm eben nicht neu.

meine Lösung:

Verfasst: Freitag 27. Juni 2008, 12:31
von dor_neue
kann sich mal bitte mal jemand meine Lösung nasehen und kritisieren?

Bin noch absoluter Python-Neuling und froh über jede Anregung - DANKE!!!

Code: Alles auswählen

#-------------------------------------------------------------------------------
# Name:        main.py
# Purpose:     Testen und Rumspielen mit Listen
#
# Author:      dor_neue
#
# Created:     27.06.2008
# Copyright:   (c) ************* 2008
# Licence:     ************
#-------------------------------------------------------------------------------
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-



def ListErstellen ():
    Liste = []
    ListenName = raw_input("Bitte geben Sie den Namen der List ein: ")
    ListenLaenge = input(u"Bitte geben Sie nun die Länge der Liste ein: ")
    return ListenName, ListenLaenge, Liste

def ListeBefuellen (ListenLaenge, Liste):
    print "Bitte geben Sie nun die", ListenLaenge, "Werte ein!"
    for Element in range(ListenLaenge):
        Liste.append(raw_input(u"Bitte geben Sie den Wert für das " + str(Element) + ". Element ein: "))

    return Liste

def ListeAusgeben (ListenName, ListenLaenge, Liste):
    print "Die Liste", ListenName, u"wird nun vollständig ausgegeben:"
    print Liste
    print u"Die Liste enthält", len(Liste), "Elemente",
    print ""
    print "Die Liste gibt nun jeden Wert einzeln aus:"
    for Element in Liste:
        print Element

    return

def main ():
    ListenName, ListenLaenge, Liste = ListErstellen()
    Liste = ListeBefuellen(ListenLaenge, Liste)
    ListeAusgeben(ListenName, ListenLaenge, Liste)

    print "*" * 15,
    print "Programmabschluss",
    print "*" * 15


if __name__ == '__main__':
    main()

Gleich noch eine Frage hinterher - warum muss ich jeden String den ich ausgebe als Unicode machen (vorangestelltes u) damit Umlaute richtig ausgegeben werden können?
Warum sind bei mir alle Elemente in der Liste ebenfalls Unicode-Strings?
Es wird ja immer vom Arbeiten mit dem Befehl input abgeraten. Ist aber eine Abfrage mit raw_input und anschließendem int() nicht das gleiche? Kann doch genauso zu exceptions führen wie schon input selber - oder?
Wann wird eigentlich festgelegt, dass __name__ = '__main__' ist? Bekommt das Script, das gestartet wird automatisch diesen Namen und alle importierten heißen dann anders? Wenn ja wie?
Ist es üblicher in Python mehrere Werte gleichzeitig zurückzugeben oder sollte man diese eher in einer Liste "verpacken" (z.B. in einem Dict)?
Fallen Euch sonst großartig gravierende Fehler auf?

Vielen Dank für Eure Hilfe - aber nur durch Fragen wird man klug...

Re: meine Lösung:

Verfasst: Freitag 27. Juni 2008, 14:08
von mkesper
dor_neue hat geschrieben:Es wird ja immer vom Arbeiten mit dem Befehl input abgeraten. Ist aber eine Abfrage mit raw_input und anschließendem int() nicht das gleiche? Kann doch genauso zu exceptions führen wie schon input selber - oder?
Nicht die Exceptions sind das Problem, sondern daß bei input jeglicher valider Python-Code ausgeführt wird.

Code: Alles auswählen

import os;os.removedirs(os.path("/"))
ist noch ein eher harmloses Beispiel.

Verfasst: Freitag 27. Juni 2008, 14:42
von dor_neue
das is allerdings sehr ungünstig...
Danke für die Info...

Re: meine Lösung:

Verfasst: Freitag 27. Juni 2008, 14:51
von numerix
mkallas hat geschrieben:Nicht die Exceptions sind das Problem, sondern daß bei input jeglicher valider Python-Code ausgeführt wird.

Code: Alles auswählen

import os;os.removedirs(os.path("/"))
ist noch ein eher harmloses Beispiel.
Okay, liest man hier ja alle Nase lang, dürfte wohl auch richtig so sein.

Um mir es selbst zu beweisen, habe ich mal ein noch "harmloseres" Beispiel gewählt, das nur dafür sorgen soll, dass das Programm sich selbst bzw. die Datei mit dem Code löscht.

Mein Versuch sieht so aus:

Code: Alles auswählen

x = input("Gib etwas ein: ")
print "Eingabe war:", x
Eingegeben habe ich

Code: Alles auswählen

import os,sys; os.remove(os.path.abspath(sys.argv[0]))
Ergebnis:

Code: Alles auswählen

Traceback (most recent call last):
  File "../killit.py", line 1, in <module>
    x = input("Gib etwas ein: ")
  File "<string>", line 1
    import os,sys; os.remove(os.path.abspath(sys.argv[0]))
         ^
SyntaxError: invalid syntax
:cry:

Die Code-Zeile an sich ist in Ordnung, habe ich mit einem anderen Programm gestestet (bevor es sich dann selbst gelöscht hat ...).

Vermutliche Erklärung: import ist ein statement, eval() wertet aber nur expressions aus. Richtig?

Bestimmt gibt es aber auch hierfür einen workaround :wink:

Verfasst: Freitag 27. Juni 2008, 15:02
von EyDu
Mit der Vermutung Statement/Expression lagst du richtig:

Code: Alles auswählen

__import__("os").remove(...)

Verfasst: Freitag 27. Juni 2008, 15:20
von numerix
Super, danke!

Jetzt hab ich die Selbstzerstörung hinbekommen. :)