Verfasst: Mittwoch 24. Dezember 2008, 02:40
Hm natürlich ... es ging ja um genestete Dicts. Entschuldige hab ich übersehen
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
dat = """The AT
Fulton NP
County NN
an AT
an AT
an AT
an NN
an IN
investigation NN
investigation XXX
investigation NN
of IN
Atlanta's NP$
recent JJ
primary NN
election NN
produced VBD """
lines = dat.splitlines() # ersetzen durch Lesen aus Datei
lines = map(str.split, lines)
lexicon = {}
for word, tag in lines:
if not lexicon.has_key(word):
lexicon[word] = {tag:1}
else:
try:
lexicon[word][tag] += 1
except:
lexicon[word][tag] = 1
Code: Alles auswählen
>>> lexicon
{'produced': {'VBD': 1}, 'of': {'IN': 1}, "Atlanta's": {'NP$': 1}, 'primary': {'NN': 1}, 'an': {'AT': 3, 'NN': 1, 'IN': 1}, 'County': {'NN': 1}, 'investigation': {'XXX': 1, 'NN': 2}, 'election': {'NN': 1}, 'The': {'AT': 1}, 'Fulton': {'NP': 1}, 'recent': {'JJ': 1}}
>>> for a, b in zip(lexicon.keys(), lexicon.values()):
print a, b
produced {'VBD': 1}
of {'IN': 1}
Atlanta's {'NP$': 1}
primary {'NN': 1}
an {'AT': 3, 'NN': 1, 'IN': 1}
County {'NN': 1}
investigation {'XXX': 1, 'NN': 2}
election {'NN': 1}
The {'AT': 1}
Fulton {'NP': 1}
recent {'JJ': 1}
Code: Alles auswählen
from __future__ import division, with_statement
from collections import defaultdict
from functools import partial
from pprint import pprint
def main():
lexicon = defaultdict(partial(defaultdict, int))
with open('test.txt') as lines:
for line in lines:
word, tag = line.rstrip().split()
lexicon[word][tag] += 1
for word, tags in sorted(lexicon.iteritems()):
print '%s: %s' % (word, sorted(tags.iteritems()))
if __name__ == "__main__":
main()
Da hast du natürlich recht, war einfach schon etwas spät in der Nacht...Ansonsten würde ich ``in`` statt `has_key()` verwenden und auf keinen Fall ein ``except`` ohne eine konkrete Ausnahme verwenden. Zeile 30 soll ja zum Beispiel nicht ausgeführt werden, wenn in Zeile 28 ein Fipptehler bei einem Namen existiert, oder wenn jemand bei der Programmausführung an einer ungünstigen Stelle Strg+C drückt.
Da bin ich anderer Meinung. Deine Variante ist wirklich nett. Hat aber meiner Meinung nach ein Problem:@HerrHagen: Also ich finde `defaultdict`\s weit weniger kryptisch als Deine Lösung, wo man sich erst einmal klar machen muss welcher Zweig wann zum Einsatz kommt, oder so eine lange Zeile mit zwei `get()`-Aufrufen.
Code: Alles auswählen
from collections import defaultdict
from functools import partial
Wieso? Eine Einsteigerlösung bedeutet ja nicht dass man alles auf umständliche Weise machen muss. Der Einsatz von ``partial`` ist da etwas Grenzwertig, da für Anfänger Funktionen höherer Ordnung etwas tricky sein können (außer sie haben Higher Order Perl gelesen, was es jetzt kostenlos online gibt), aber das ``defaultdict`` macht den Code ausreichend simpler dass es sich lohnt einfach mal in die Doku zu schauen was es tut. Einsteigercode ist ja auch für den Einstieg gedacht aber das heißt ja nicht dass man an dem Code nicht wachsen kann.HerrHagen hat geschrieben:Da bin ich anderer Meinung. Deine Variante ist wirklich nett. Hat aber meiner Meinung nach ein Problem:Man benötigt die Kenntnis der Funktionsweise von gleich zwei Standard-Modulen. Das ist ja nichts schlimmes, ist aber als Einsteigerlösung (nach der hier gefragt wurde) eher weniger zu gebrauchen.Code: Alles auswählen
from collections import defaultdict from functools import partial
Einige Leute haben halt Templates für neue Python-Dateien und da kann es dann vorkommen, dass da ``pprint`` oder ``division`` automatisch importiert werden. Für den Quelltext ist es natürlich unnötig.HerrHagen hat geschrieben:Warum importierst du pprint, division wenn du sie dann nicht benutzt?