Seite 1 von 1

cast zu list

Verfasst: Samstag 19. Februar 2005, 01:25
von Seppl
Hi,

wie kann ich in python ein 'NoneType' object zu einer liste casten?

ich habe ein wörterbuch das folgendermaßen aufgebaut ist.

Code: Alles auswählen

at :: am
at :: an
at :: auf
at :: bei
at :: beim
at :: im
at :: Top-Level-Domain für Austria
at :: über
at :: um
at :: zu
das will ich in ein dictionary parsen: key ist englische wort, value eine liste der möglichen deutschen.
das war meine erste idee das zu tun:

Code: Alles auswählen

dictFile = open("dict.txt", "r"); EN = 0; DE = 1 # wörterbuch: <en> :: <de>
pSplit = re.compile( "(.*)(?:::)(.*)", re.I | re.M )
dictList.extend( pSplit.findall( dictFile.read() ) )
for item in dictList:
    if dictHash.has_key( item[EN] ):
        dictHash[ item[EN] ] = dictHash[ item[EN] ].append( item[DE] )
    else:
        dictHash[ item[EN] ] = [ item[DE] ]
aber leider:
AttributeError: 'NoneType' object has no attribute 'append'

auch wenn es andere lösungen (die mich auch interessieren) für dieses problem gibt: wie kann ich dictHash[ item[EN] ] zu einer liste casten?

nochwas: gibt es eine möglichkeit eine variable von einem best typ zu vereinbaren ausser

list = [] oder dict = {}

?

danke schonmal :)

Re: cast zu list

Verfasst: Samstag 19. Februar 2005, 01:44
von Leonidas
Seppl hat geschrieben:

Code: Alles auswählen

at :: am
at :: an
at :: auf
at :: bei
at :: beim
at :: im
at :: Top-Level-Domain für Austria
at :: über
at :: um
at :: zu
Sieht aus wie das Wörterbuch von ding, ne? Hab ich auch schon damit in Python gespielt.
Seppl hat geschrieben:das will ich in ein dictionary parsen: key ist englische wort, value eine liste der möglichen deutschen.
das war meine erste idee das zu tun:

Code: Alles auswählen

dictFile = open("dict.txt", "r"); EN = 0; DE = 1 # wörterbuch: <en> :: <de>
pSplit = re.compile( "(.*)(?:::)(.*)", re.I | re.M )
dictList.extend( pSplit.findall( dictFile.read() ) )
for item in dictList:
    if dictHash.has_key( item[EN] ):
        dictHash[ item[EN] ] = dictHash[ item[EN] ].append( item[DE] )
    else:
        dictHash[ item[EN] ] = [ item[DE] ]
aber leider:
AttributeError: 'NoneType' object has no attribute 'append'

auch wenn es andere lösungen (die mich auch interessieren) für dieses problem gibt: wie kann ich dictHash[ item[EN] ] zu einer liste casten?
Du machst halt einfach eine try-except schrleife, die dann bei Exceptions nicht zu None anhängt, sondern, sondern eine leere Dict ist.
Seppl hat geschrieben:nochwas: gibt es eine möglichkeit eine variable von einem best typ zu vereinbaren ausser

list = [] oder dict = {}

?
Du weißt schon dass es in Python keine Typsicherheit gibt?

Code: Alles auswählen

list()
dict()

Verfasst: Samstag 19. Februar 2005, 03:51
von Gast
danke für die schnelle antwort,
hatte die fehlermeldung falsch interpretiert.
dachte python will kein append auf den dict-value anwenden, dabei war der wert einfach none ...

Verfasst: Samstag 19. Februar 2005, 22:51
von Seppl
kann mir das jemand erklären

Code: Alles auswählen

# funktioniert wie erwartet
dictHash[ item[0] ].append( item[1] ) 

# dictHash[ item[0] ] ist danach None !?
dictHash[ item[0] ] = dictHash[ item[0] ].append( item[1] ) 

Verfasst: Sonntag 20. Februar 2005, 00:37
von BlackJack
Seppl hat geschrieben:kann mir das jemand erklären

Code: Alles auswählen

# funktioniert wie erwartet
dictHash[ item[0] ].append( item[1] ) 

# dictHash[ item[0] ] ist danach None !?
dictHash[ item[0] ] = dictHash[ item[0] ].append( item[1] ) 
Klar kann das jemand erklären. Der Rückgabewert von der Methode `append()` ist `None`. Und den weist Du im zweiten Beispiel zu.

Das ganze ist IMHO etwas unleserlich. Ich würd's so schreiben:

Code: Alles auswählen

for english, german in dictList:
    entry = dictHash.setdefault(english, list())
    entry.append(german)
`dict.setdefault` setzt den Eintrag für den Schlüssel auf den zweiten Parameter, falls es noch keinen solchen Eintrag gibt und liefert in jedem Fall den Wert zum Schlüssel zurück.