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?


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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.