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

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

Beitragvon Lock on » Donnerstag 26. Juni 2008, 21:11

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: 2402
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Donnerstag 26. Juni 2008, 21:14

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: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

Beitragvon Hyperion » Donnerstag 26. Juni 2008, 21:15

Lock on hat geschrieben:PS: Google und Suchfunktion haben nicht weitergeholfen.

Dann guck mal ins Tutorial ;-)
lunar

Beitragvon lunar » Donnerstag 26. Juni 2008, 21:27

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

Beitragvon cofi » Donnerstag 26. Juni 2008, 22:22

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

Beitragvon Lock on » Donnerstag 26. Juni 2008, 22:48

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:

Beitragvon Rebecca » Donnerstag 26. Juni 2008, 23:08

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

Beitragvon Zap » Freitag 27. Juni 2008, 05:27

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

Beitragvon Darii » Freitag 27. Juni 2008, 07:32

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

Beitragvon numerix » Freitag 27. Juni 2008, 08:07

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:

Beitragvon Rebecca » Freitag 27. Juni 2008, 08:36

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

Beitragvon Zap » Freitag 27. Juni 2008, 08:47

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

Beitragvon Lock on » Freitag 27. Juni 2008, 09:04

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 27. Juni 2008, 09:33

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

meine Lösung:

Beitragvon dor_neue » Freitag 27. Juni 2008, 12:31

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...

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot]