Python-Dict und -Datei

Dict-Hash-Tabelle

Die effiziente Struktur von Python-Schlüssel/Wert-Hash-Tabellen wird als „dict“ bezeichnet. Der Inhalt eines Dictionary kann als Reihe von Schlüssel/Wert-Paaren in geschweiften Klammern { } geschrieben werden, z. B. dict = {key1:value1, key2:value2, ... }. Ein leeres Dictionary besteht nur aus geschweiften Klammern {}.

Der Wert in einem Dictionary wird mit eckigen Klammern gesucht oder festgelegt. So sucht dict['foo'] z. B. nach dem Wert unter dem Schlüssel „foo“. Strings, Zahlen und Tupel können als Schlüssel verwendet werden und jeder Typ kann ein Wert sein. Andere Typen funktionieren als Schlüssel möglicherweise nicht richtig (Strings und Tupel funktionieren einwandfrei, da sie unveränderlich sind). Wenn Sie einen Wert abrufen, der nicht in der Dictionary vorhanden ist, wird eine KeyError-Ausnahme ausgelöst. Verwenden Sie „in“, um zu prüfen, ob der Schlüssel in der Dictionary vorhanden ist, oder verwenden Sie dict.get(key), um den Wert oder „None“ zurückzugeben, wenn der Schlüssel nicht vorhanden ist. Mit get(key, not-found) können Sie angeben, welcher Wert im Fall „nicht gefunden“ zurückgegeben werden soll.

  ## Can build up a dict by starting with the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print(dict['a'])     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print(dict['z'])                  ## Throws KeyError
  if 'z' in dict: print(dict['z'])     ## Avoid KeyError
  print(dict.get('z'))  ## None (instead of KeyError)

Diktat mit den Tasten "a", "o", "g"

Bei einer For-Schleife in einem Wörterbuch werden standardmäßig die Schlüssel durchgegangen. Die Schlüssel werden in einer beliebigen Reihenfolge angezeigt. Die Methoden dict.keys() und dict.values() geben explizit Listen der Schlüssel oder Werte zurück. Außerdem gibt es die Funktion „items()“, die eine Liste von Tupeln vom Typ „Schlüssel, Wert“ zurückgibt. Dies ist die effizienteste Methode, um alle Schlüssel/Wert-Daten im Wörterbuch zu prüfen. Alle diese Listen können an die Funktion „sorted()“ übergeben werden.

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict:
    print(key)
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys():
    print(key)

  ## Get the .keys() list:
  print(dict.keys())  ## dict_keys(['a', 'o', 'g'])

  ## Likewise, there's a .values() list of values
  print(dict.values())  ## dict_values(['alpha', 'omega', 'gamma'])

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print(key, dict[key])

  ## .items() is the dict expressed as (key, value) tuples
  print(dict.items())  ##  dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')])

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print(k, '>', v)
  ## a > alpha    o > omega     g > gamma

Strategiehinweis: Aus Leistungssicht ist das Wörterbuch eines Ihrer wichtigsten Tools. Sie sollten es daher nach Möglichkeit verwenden, um Daten einfach zu organisieren. Sie können beispielsweise eine Protokolldatei lesen, in der jede Zeile mit einer IP-Adresse beginnt, und die Daten in einem Dictionary speichern, wobei die IP-Adresse als Schlüssel und die Liste der Zeilen, in denen sie vorkommt, als Wert verwendet wird. Nachdem Sie die gesamte Datei eingelesen haben, können Sie eine beliebige IP-Adresse suchen und sofort die Liste der Zeilen sehen. Das Wörterbuch nimmt verteilte Daten auf und macht sie kohärent.

Dict-Formatierung

Mit dem %-Operator können Sie Werte aus einem Dictionary per Name in einen String einfügen:

  h = {}
  h['word'] = 'garfield'
  h['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % h  # %d for int, %s for string
  # 'I want 42 copies of garfield'

  # You can also use str.format().
  s = 'I want {count:d} copies of {word}'.format(h)

Entf

Der Operator "del" führt Löschvorgänge aus. Im einfachsten Fall kann die Definition einer Variablen entfernt werden, so als wäre diese Variable nicht definiert worden. Del kann auch für Listenelemente oder Segmente verwendet werden, um diesen Teil der Liste und Einträge aus einem Wörterbuch zu löschen.

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print(list)      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print(dict)      ## {'a':1, 'c':3}

Dateien

Die Funktion „open()“ öffnet und gibt einen Dateihandle zurück, mit dem eine Datei auf die übliche Weise gelesen oder geschrieben werden kann. Mit dem Code „f = open('name', 'r')“ wird die Datei in der Variablen „f“ geöffnet und für Lesevorgänge bereitgestellt. Verwenden Sie „f.close()“, wenn Sie fertig sind. Verwenden Sie anstelle von „r“ den Befehl „w“ zum Schreiben und „a“ zum Anhängen. Die Standard-for-Schleife funktioniert für Textdateien und durchläuft die Zeilen der Datei. Dies funktioniert nur für Textdateien, nicht für Binärdateien. Die For-Schleife ist eine einfache und effiziente Möglichkeit, sich alle Zeilen in einer Textdatei anzusehen:

  # Echo the contents of a text file
  f = open('foo.txt', 'rt', encoding='utf-8')
  for line in f:   ## iterates over the lines of the file
    print(line, end='')    ## end='' so print does not add an end-of-line char
                           ## since 'line' already includes the end-of-line.
  f.close()

Wenn Sie eine Zeile nach der anderen lesen, muss nicht die gesamte Datei gleichzeitig im Arbeitsspeicher gespeichert werden. Das ist praktisch, wenn Sie sich jede Zeile in einer 10-Gigabyte-Datei ansehen möchten, ohne 10 Gigabyte Arbeitsspeicher zu verbrauchen. Die Methode f.readlines() liest die gesamte Datei in den Arbeitsspeicher und gibt den Inhalt als Liste der Zeilen zurück. Mit der Methode „f.read()“ wird die gesamte Datei in einen einzelnen String gelesen. Das kann eine praktische Möglichkeit sein, den Text auf einmal zu verarbeiten, z. B. mit regulären Ausdrücken, die wir später kennenlernen.

Die Methode f.write(string) ist die einfachste Möglichkeit, Daten in eine offene Ausgabedatei zu schreiben. Sie können „print“ auch mit einer geöffneten Datei verwenden, z. B. „print(string, file=f)“.

Dateien – Unicode

Verwenden Sie zum Lesen und Schreiben von Unicode-codierten Dateien den Modus „t“ und geben Sie explizit eine Codierung an:


with open('foo.txt', 'rt', encoding='utf-8') as f:
  for line in f:
    # here line is a *unicode* string

with open('write_test', encoding='utf-8', mode='wt') as f:
    f.write('\u20ACunicode\u20AC\n') #  €unicode€
    # AKA print('\u20ACunicode\u20AC', file=f)  ## which auto-adds end='\n'

Inkrementelle Entwicklung üben

Schreiben Sie beim Erstellen eines Python-Programms nicht alles in einem Schritt. Geben Sie stattdessen nur einen ersten Meilenstein an, z. B. „Der erste Schritt besteht darin, die Liste der Wörter zu extrahieren.“ Schreiben Sie den Code, um zu diesem Meilenstein zu gelangen, und geben Sie an diesem Punkt einfach Ihre Datenstrukturen aus. Anschließend können Sie sys.exit(0) ausführen, damit das Programm nicht in seine nicht fertigen Teile weiterläuft. Sobald der Meilensteincode funktioniert, können Sie an Code für den nächsten Meilenstein arbeiten. Wenn Sie sich den Ausdruck Ihrer Variablen in einem bestimmten Zustand ansehen können, können Sie darüber nachdenken, wie Sie diese Variablen transformieren müssen, um zum nächsten Zustand zu gelangen. Python ist mit diesem Muster sehr schnell, sodass Sie eine kleine Änderung vornehmen und das Programm ausführen können, um zu sehen, wie es funktioniert. Nutzen Sie diese kurze Zeitspanne, um Ihr Programm in kleinen Schritten zu erstellen.

Übung: wordcount.py

Kombinieren Sie alle grundlegenden Python-Materialien – Strings, Listen, Dictionaries, Tupel, Dateien – und versuchen Sie sich an der Zusammenfassungsübung wordcount.py in den Grundlegenden Übungen.