TypeError: Das Objekt 'zip' ist nicht abonnierbar

74

Ich habe eine getaggte Datei im Format Token / Tag und versuche eine Funktion, die ein Tupel mit Wörtern aus einer (Wort-, Tag-) Liste zurückgibt.

def text_from_tagged_ngram(ngram): 
    if type(ngram) == tuple:
        return ngram[0]
    return " ".join(zip(*ngram)[0]) # zip(*ngram)[0] returns a tuple with words from a (word,tag) list

In Python 2.7 hat es gut funktioniert, aber in Python 3.4 gibt es folgenden Fehler:

return " ".join(list[zip(*ngram)[0]])
TypeError: 'zip' object is not subscriptable

Kann jemand helfen?

sss
quelle
1
nelsonslog.wordpress.com/2015/04/20/python3-zip-is-a-hassle hat eine Problemumgehung , die Sie interessieren könnte.
Jaggi

Antworten:

132

In Python 2 wurde zipeine Liste zurückgegeben. zipGibt in Python 3 ein iterierbares Objekt zurück. Sie können es jedoch zu einer Liste machen, indem Sie einfach Folgendes aufrufen list:

list(zip(...))

In diesem Fall wäre das:

list(zip(*ngram))

Mit einer Liste können Sie die Indizierung verwenden:

items = list(zip(*ngram))
...
items[0]

etc.

Wenn Sie jedoch nur das erste Element benötigen, benötigen Sie keine Liste. Sie könnten einfach verwenden next.

In diesem Fall wäre das:

next(zip(*ngram))
khelwood
quelle