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

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.
Lock on
User
Beiträge: 4
Registriert: Sonntag 22. Juni 2008, 09:14

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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')
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Lock on hat geschrieben: PS: Google und Suchfunktion haben nicht weitergeholfen.
Dann guck mal ins Tutorial ;-)
lunar

Mein Gott, hast du wirklich niemals std::vector oder ArrayList genutzt? :shock:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Lock on
User
Beiträge: 4
Registriert: Sonntag 22. Juni 2008, 09:14

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...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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 }
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.Ä.?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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".
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Zap hat geschrieben:Kleiner Verbesserungsvorschlag um das Ergebnis auszugeben
Bild
War schon spaet gestern...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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 }
Lock on
User
Beiträge: 4
Registriert: Sonntag 22. Juni 2008, 09:14

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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...
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

das is allerdings sehr ungünstig...
Danke für die Info...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mit der Vermutung Statement/Expression lagst du richtig:

Code: Alles auswählen

__import__("os").remove(...)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Super, danke!

Jetzt hab ich die Selbstzerstörung hinbekommen. :)
Antworten