Tuples und Dictionaries

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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo, wie ihr an meiner kleinen Übungsaufgabe seht lerne ich gerade den Umgang von Tuples und Dictionaries. In den Kommentaren schreibe ich für mich Informationen zu dem Thema rein, damit ich nicht alles auf einem Zettel schreiben muss, und ich es somit gleich präsent habe. Sollte also etwas falsch in meinem Kommentar sein, so könnt ihr gerne korrigieren, schließlich lerne ich dann es besser :-)

Kommen wir aber nun zu meinem Anliegen. Wie ihr in meinen Kommentaren sehen könnt weiß ich nun rein formal, dass Tuples unveränderbar und Dictionaries veränderbar sind. Nun stoße ich hier auf Verständnisfragen. Was meint hier "unveränderbar" und "veränderbar"? Ich meine, bei den Tulpes in Zeile 5 und Zeile 9 kann ich doch anstatt "Hallo Welt" sonstwas reinschreiben, somit habe ich es "verändert" so wie es bei Dictionaries der Fall wäre. Ihr seht, ich stehe momentan auf dem Schlauch.

Da ich ein blutiger Anfänger bin, bitte nicht zu hoch greifen.

Gruß
Sophus.

Code: Alles auswählen

# -*- coding: cp1252 -*-
#Tuples und Dictionaries sind zwei Arten von Arrays.
#Tuple ist ähnlich wie ein Array, er kann nicht verändert werden.
#Man kann kein Tuple löschen oder hinzufügen.
var = "Hallo", "Welt" #Hier beginnen wir einen Tuple zu definieren.
print var

#Man kann auch mit zwei Elementen nebeneinander arbeiten
var1, var2 = "Hallo", (", wie geht", "es dir?")
print var1, var2

#Jetzt zu den Dictionaries.
#Sie sind auch sehr ähnlich wie Arrays.
#Unterschied, sie gehen nicht von 0 bis 10,
#sondern, haben eigene Schlüssel und Werte.
#Man kann Dictionaries genauso definieren wie Variablen.
#Im Gegensatz zu Tuples sind Dictionaries veränderbar.
VarDict ={"Land":"Deutschland", "Sprache":"Deutsch"}
print VarDict #So ist es aber weniger nützlich.
print "Wir leben zur Zeit in " + VarDict["Land"] #Der Schlüssel "Land" wird hier aufgerufen.
												 #Der Schlüssel "Land" hat den Wert "Deutschland"
print "Ich spreche gerade " + VarDict["Sprache"]

#Eine kleine Funktion für die Dictionaries.
print len(VarDict) #Hier wird die Zahl 2 ausgegebn, weil ich zwei Schlüssel habe.
BlackJack

@Sophus: Tupel und Wörterbücher sind nicht zwei Arten von Arrays. Zumindest nicht wenn man den Begriff Array nicht anders definiert als er in Python und Sprachen wie C oder Java definiert ist. Am besten man verwendet den nicht allgemein, sondern nur für die konkreten Typen die in Python unter dem Namen bekannt sind, also vorranging Numpy-Arrays und deutlich weniger oft aus dem `array`-Modul aus der Standardbibliothek.

Üblicher wäre ganz allgemein von Container-Objekten zu sprechen und so wirklich ähnlich sind die sich eigentlich nicht, weil die Daten recht unterschiedlich organisiert sind. Tupel ist ein Sequenztyp der Elemente in einer geordneten Reihenfolge enthält und ein Wörterbuch ist ein Abbildungstyp der Schlüssel auf Werte abbildet, wo aber die Elemente keine garantierte Reihenfolge haben.

Zu Frage: Du kannst ein Tupel mit anderen Werten *erstellen*, aber Du kannst bei einem bereits erstellten Tupel kein Element durch ein neues ersetzen oder entfernen oder hinzufügen und damit das bestehende Tupel verändern. Bei bestehenden Wörterbüchern kann man dagegen neue Schlüssel/Wert-Paare hinzufügen, Werte zu bestehenden Schlüsseln ersetzen, und auch Schlüssel/Wert-Paare entfernen.

`len()` ist eine allgemeine Funktion mit der man die ”Länge” von Containerobjekten abfragen kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sophus hat geschrieben: Kommen wir aber nun zu meinem Anliegen. Wie ihr in meinen Kommentaren sehen könnt weiß ich nun rein formal, dass Tuples unveränderbar und Dictionaries veränderbar sind. Nun stoße ich hier auf Verständnisfragen. Was meint hier "unveränderbar" und "veränderbar"? Ich meine, bei den Tulpes in Zeile 5 und Zeile 9 kann ich doch anstatt "Hallo Welt" sonstwas reinschreiben, somit habe ich es "verändert" so wie es bei Dictionaries der Fall wäre.
Du hast in Deinem Code bisher *kein* Objekt verändert, auch kein Dictionary ;-)

Beispiel:

Code: Alles auswählen

# Listen kennen z.B. "append"
l = [1, 2, 3]
# jetzt *verändern* wir das Objekt!
l.append(4)

print(l)
> [1, 2, 3, 4]

# Tupel haben nichts, um den Inhalt zu ändern!
t = (1, 2, 3)

# Dictionaries lassen sich auch erweitern:
d = {"foo": 42}
d["bar"] = 99
print(d)
> {'foo': 42, 'bar': 99}
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo,

mir ist das alles noch etwas zuhochgegriffen - zuviel Input auf einmal. Konzentrieren wir uns auf Tupel. Sie ist angeblich nicht veränderbar. Gut. Aber am Beispiel habe ich sie ja verändert:

Code: Alles auswählen

var1, var2 , var3 = "Hallo", (", wie geht", "es dir?"), ("Mir gehts gut.")
print var1, var2, var3
Hier habe ich var 3 einfach hinzugefügt - nach meinem Verständnis also veränderbar?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Entschuldige, ich verstehe nur Bahnhof. Schrieb ich nicht, dass ihr nicht zu hoch greifen solltet oder hab ich die Zeile vergessen? Ich will was lernen, und nicht das Gefühl haben, gerade wie ein Schimpanse jammernd nach einer Banane zu betteln.

Danke.

Gruß
Sophus
Hyperion hat geschrieben:
Sophus hat geschrieben: Kommen wir aber nun zu meinem Anliegen. Wie ihr in meinen Kommentaren sehen könnt weiß ich nun rein formal, dass Tuples unveränderbar und Dictionaries veränderbar sind. Nun stoße ich hier auf Verständnisfragen. Was meint hier "unveränderbar" und "veränderbar"? Ich meine, bei den Tulpes in Zeile 5 und Zeile 9 kann ich doch anstatt "Hallo Welt" sonstwas reinschreiben, somit habe ich es "verändert" so wie es bei Dictionaries der Fall wäre.
Du hast in Deinem Code bisher *kein* Objekt verändert, auch kein Dictionary ;-)

Beispiel:

Code: Alles auswählen

# Listen kennen z.B. "append"
l = [1, 2, 3]
# jetzt *verändern* wir das Objekt!
l.append(4)

print(l)
> [1, 2, 3, 4]

# Tupel haben nichts, um den Inhalt zu ändern!
t = (1, 2, 3)

# Dictionaries lassen sich auch erweitern:
d = {"foo": 42}
d["bar"] = 99
print(d)
> {'foo': 42, 'bar': 99}
BlackJack

@Sophus: Mit nicht veränderbar ist gemeint das ein Tupel im laufenden Programm nicht verändert werden kann. Und das hast Du ja auch nicht gemacht. Wenn ein Tupel erstellt wurde, kann man es nicht mehr verändern (jedenfalls nicht ”legal”).
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Code: Alles auswählen

a = [1,2,3] # eine list
a[1] = "X"
print( a ) # alles klar?

b = (1,2,3) # ein tuple
b[1] = "X" # Ueberaschung!
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: Du hast Dein Programm verändert! Programme sind veränderbar. Wäre auch schlimm, wenn nicht, dann wären alle Programmierer arbeitslos.

PS: in Deinem Programm ist nur »var2« ein Tuple, »var1« und »var3« sind Strings.
Zuletzt geändert von Sirius3 am Freitag 6. Juni 2014, 17:46, insgesamt 1-mal geändert.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Ach so, es ging also um die Laufzeit?
Gut, dann bin ich schon mal einen Schritt weiter. Aber Hyperions Beispiel verstehe ich trotzdem nicht, er hätte auch chinesisch rückwärts schreiben können und ich wär genauso schlau wie vorher. Gibt es ein einfacheres Beispiel, damit ich das etwas verinnerlichen kann bzw um es zu verdeutlichen?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

In Hyperions Beispiel wird eine Liste erzeugt und verändert, ein Dictionary erzeugt und verändert, ein Tuple erzeugt und nicht verändert, weil das nicht geht. Die Zeilen die mit '>' anfangen sollen nur die Ausgaben repräsentieren.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Sirius3 hat geschrieben:@Sophus: Du hast Dein Programm verändert! Programme sind veränderbar. Wäre auch schlimm, wenn nicht, dann wären alle Programmierer arbeitslos.

PS: in Deinem Programm ist nur »var2« ein Tuple, »var1« und »var3« sind Strings.
Weil dort Kommata fehlen, richtig? Denn zu den anderen vars ist bei var2 ein Komma vorhanden.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Sirius3 hat geschrieben:In Hyperions Beispiel wird eine Liste erzeugt und verändert, ein Dictionary erzeugt und verändert, ein Tuple erzeugt und nicht verändert, weil das nicht geht. Die Zeilen die mit '>' anfangen sollen nur die Ausgaben repräsentieren.
Eine Liste? Du meinst, ein Array?

Genauso könnte ich auch schreiben:

Code: Alles auswählen


myArray = ['Mike','Peter','Anna']
print myArray[0] # Die Zählung beginnt bei Null. Mike wäre 0, Peter 1 und Anna 2
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sophus hat geschrieben:Aber Hyperions Beispiel verstehe ich trotzdem nicht, er hätte auch chinesisch rückwärts schreiben können und ich wär genauso schlau wie vorher.
Was ist an meinem Beispiel denn nicht verständlich? Ich habe doch klar gezeigt, dass man einige Typen ändern kann und Tupel eben nicht. Ok, man hätte noch eine Zuweisung wie es MagBen gezeigt hat einbauen können, damit es noch klarer wird.

Im übrigen behandelt man doch niemanden wie einen Schimpansen, wenn man Dir ein recht langes Beispiel postet - das impliziert eigentlich, dass man sich Mühe gibt. Aber so langsam reicht es mit dann doch mit Deinem Tonfall und Deiner Art! :evil:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sophus hat geschrieben:Eine Liste? Du meinst, ein Array?
Nein, wie es da steht. Eine Liste.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sophus hat geschrieben: Eine Liste? Du meinst, ein Array?

Genauso könnte ich auch schreiben:

Code: Alles auswählen


myArray = ['Mike','Peter','Anna']
print myArray[0] # Die Zählung beginnt bei Null. Mike wäre 0, Peter 1 und Anna 2
Was Du hier verwendest sind Listen ;-) Arrays gibt es in Python auch, sind aber weniger gebräuchlich.

Gib mal in einer Shell ``type(myArray)`` ein ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

MagBens Beispiel habe ich auch gleich verstanden. Für mich war es eben einfach zu hoch gegriffen. Da hätte ich mir auch chinesische Bücher durchlesen können, und am Ende hätte ich mehr Fragen als Antworten. Mit anderen Worten, war es für mich keine Hilfe, weil du mir dadurch mehr Fragen aufgeworfen hast. Und das ist für mich keine Art von Hilfe. Aber trotzdem Danke für nichts - zumindest war es für mich nichts.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Also augenscheinlich sehe ich keinen Unterschied zwischen meinem Array und der Liste - abgesehen dass dort andere Zeichen stehen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sophus hat geschrieben:MagBens Beispiel habe ich auch gleich verstanden. Für mich war es eben einfach zu hoch gegriffen. Da hätte ich mir auch chinesische Bücher durchlesen können, und am Ende hätte ich mehr Fragen als Antworten. Mit anderen Worten, war es für mich keine Hilfe, weil du mir dadurch mehr Fragen aufgeworfen hast. Und das ist für mich keine Art von Hilfe. Aber trotzdem Danke für nichts - zumindest war es für mich nichts.
Wenn Hyperions Beispiel zu kompliziert für dich ist, dann fehlen dir absolute Grundlagen. Aber das willst du wohl wieder nicht einsehen. Auf meine Hilfe brauchst du in jeden Fall nicht mehr zählen, wer hier so dumm rumpöbelt und beleidigt, der will einfach keine Hilfe.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du hast ja immer noch nicht gesagt, *was* Du daran nicht verstanden hast! Ich habe dort ja kein Chinesisch, sondern Python und DEUTSCH geschrieben. ``append`` wirst Du ja hoffentlich übersetzen können und dann ist das, was es tut doch offensichtlich. Und die Zuweisung bei Dictionaries sollte Dir ja eigentlich schon begegnet sein - wenn nicht, hast Du sie nun gesehen. Was ist daran bitte schön unverständlich? Zumal das Beispiel von MagBen auch den Index-Operator verwendet... :roll:

Natürlich musst Du Dir auch mal eine Python-Shell aufmachen und Dinge ausprobieren, um sie nachvollziehen zu können! Ich vermute Du arbeitest bisher nicht mit einer Shell, sondern startest wirklich immer Programme, die Du im Texteditor getippt hast?

Falls ja, solltest Du das Starten und Bedienen der Python-Shell im offiziellen Tutorial noch mal angucken; das kommt iirc ganz zu Beginn vor.

Gerade solche "Spielereien" mit den grundlegenden Containern lernt man damit am besten!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sophus hat geschrieben:Also augenscheinlich sehe ich keinen Unterschied zwischen meinem Array und der Liste - abgesehen dass dort andere Zeichen stehen.
Ja, "augenscheinlich" siehst Du keinen Unterschied - in Python heißen diese Dinge mit eckigen Klammern aber nun einmal Listen! Und Arrays sind eben etwas anderes. Ich habe Dir dazu ja einen Link gegeben und dazu noch den Tipp mit dem ``type`` - der schreibt Dir das sogar hin!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten