Python-Dict und -Datei

Dict-Hash-Tabelle

Die effiziente Struktur von Python-Schlüssel/Wert-Hash-Tabellen wird als „dict“ bezeichnet. Der Inhalt eines Wörterbuchs kann als eine Reihe von Schlüssel/Wert-Paaren in geschweiften Klammern { } geschrieben werden, z.B. dict = {key1:value1, key2:value2, ... }. Das „leere Wörterbuch“ nur ein leeres Paar geschweifter Klammern {} ist.

Zum Suchen oder Festlegen eines Werts in einem Wörterbuch werden eckige Klammern verwendet, z.B. dict['foo'] sucht den Wert unter dem Schlüssel "foo". Strings, Zahlen und Tupel dienen als Schlüssel und jeder Typ kann ein Wert sein. Andere Schlüssel funktionieren möglicherweise nicht richtig als Schlüssel (Zeichenfolgen und Tupel funktionieren sauber, da sie unveränderlich sind). Bei der Suche nach einem Wert, der nicht im Wörterbuch enthalten ist, wird ein KeyError ausgelöst. Verwenden Sie "in". um zu überprüfen, ob der Schlüssel im Wörterbuch enthalten ist, oder verwenden Sie dict.get(key), die den Wert oder None zurückgibt, wenn der Schlüssel nicht vorhanden ist. Mit get(key, not-found) können Sie angeben, welcher Wert im nicht gefundenen Fall 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"

Eine For-Schleife für ein Wörterbuch iteriert standardmäßig über seine Schlüssel. Die Schlüssel werden in beliebiger Reihenfolge angezeigt. Die Methoden dict.keys() und dict.values() geben explizit Listen der Schlüssel oder Werte zurück. Es gibt auch die Funktion items(), die eine Liste von Tupeln (Schlüssel, Wert) zurückgibt. Dies ist die effizienteste Möglichkeit, um alle Schlüsselwertdaten im Wörterbuch zu untersuchen. Alle diese Listen können an die Funktionsorting() ü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

Hinweis zur Strategie: Aus Leistungssicht ist das Wörterbuch eines Ihrer besten Tools, und Sie sollten es dort verwenden, wo es für eine einfache Möglichkeit zur Datenorganisation möglich ist. Sie können beispielsweise eine Protokolldatei lesen, in der jede Zeile mit einer IP-Adresse beginnt, und die Daten in einem Wörterbuch mit der IP-Adresse als Schlüssel und der Liste der Zeilen speichern, in denen sie als Wert angezeigt wird. Sobald Sie die gesamte Datei gelesen haben, können Sie nach einer beliebigen IP-Adresse suchen und sofort die Liste der Zeilen sehen. Das Wörterbuch nimmt verteilte Daten auf und macht sie kohärent.

Dict-Formatierung

Der %-Operator funktioniert praktisch, um Werte aus einem Wörterbuch nach Namen in einen String zu ersetzen:

  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

Das „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() wird geöffnet und gibt ein Datei-Handle zurück, das zum Lesen oder Schreiben einer Datei auf die übliche Weise verwendet werden kann. Der Code f = open('name', 'r') öffnet die Datei in der Variablen f, die für Leseoperationen bereit ist, und verwendet nach Abschluss f.close(). Verwenden Sie statt „r“ das Zeichen „w“. für das Schreiben und zum Anhängen. Die Standard-For-Schleife funktioniert bei Textdateien und iteriert durch die Zeilen der Datei. Dies funktioniert nur bei Textdateien, nicht bei 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()

Das Lesen einzelner Zeilen bietet die Qualität, dass nicht jede Datei gleichzeitig in den Speicher passen muss. Das ist praktisch, wenn Sie jede Zeile in einer 10-Gigabyte-Datei ansehen möchten, ohne 10 Gigabyte Speicher zu verbrauchen. Die Methode f.readlines() liest die gesamte Datei in den Speicher und gibt ihren Inhalt als Liste ihrer Zeilen zurück. Die Methode f.read() liest die gesamte Datei in eine einzelne Zeichenfolge. Dies kann eine praktische Möglichkeit sein, um den gesamten Text auf einmal zu verarbeiten, wie z. B. mit regulären Ausdrücken, die wir später sehen werden.

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

Unicode-Dateien

Verwenden Sie zum Lesen und Schreiben von Unicode-codierten Dateien einen "'t'"-Modus 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 der Übung

Wenn Sie ein Python-Programm erstellen, schreiben Sie nicht alles in einem Schritt. Geben Sie stattdessen nur einen ersten Meilenstein an, z.B. „Der erste Schritt besteht darin, die Wortliste 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 für einen Zustand ansehen können, kann Ihnen das dabei helfen, darüber nachzudenken, wie Sie diese Variablen transformieren müssen, um in den 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 schnelle Bearbeitungszeit, um Ihr Programm in kleinen Schritten zu erstellen.

Übung: Wordcount.py

Kombinieren Sie das gesamte grundlegende Python-Material – Strings, Listen, Dictionarys, Tupel, Dateien –, versuchen Sie es mit der Zusammenfassungsübung wordcount.py in den Grundlagenübungen.