cast zu list

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.
Antworten
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 :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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 ...
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] ) 
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.
Antworten