TypeError: indicii listei trebuie să fie întregi, nu str (conversie booleană de fapt) (Programare, Python, Găsiți, Film, Revizuire)

RokiDGupta a intrebat.
import nltk
import random
from nltk.corpus import movie_reviews

documents=[(list(movie_reviews.words(fileid)),category)
           for category in movie_reviews.categories()
           for fileid in movie_reviews.fileids(category)]

random.shuffle(documents)
#print(documents[1])

all_words=[]

for w in movie_reviews.words():
    all_words.append(w.lower())

all_words=nltk.FreqDist(all_words)

word_features = list(all_words.keys())[:3000]

def find_features(document):
    words = set(document)
    features=[]
    for w in word_features:
        features[w]= (w in words)

    return features

print((find_features(movie_reviews.words('neg/cv000_29416.txt'))))

featuresets = [(find_features(rev), category) for (rev,category) in documents]

După rulare, primesc eroarea

features[w]= (w in words)
TypeError: list indices must be integers, not str

Vă rog să mă ajutați să o rezolv…

Comentarii

  • features ar trebui să fie o listă sau un dict ? –  > Por polku.
  • caracteristicile definite ca o listă chiar mai sus, ar trebui să fie un dict pentru a accepta șiruri de caractere ca „indexuri” – –  > Por Jean-François Fabre.
  • Încercați să declarați caracteristicile ca un dict features = {} în loc de features = [] –  > Por Raja Sattiraju.
  • Evident, o eroare comună: TypeError: indicii listei trebuie să fie întregi, nu șiruri de caractere Python, Python: TypeError: indicii de listă trebuie să fie întregi, nu str, TypeError: indicii de șiruri trebuie să fie întregi, nu str pe Dicționar Python,… –  > Por Wolf.
  • Mulțumită lui @DerMechaniker ….It funcționează –  > Por RokiDGupta.
2 răspunsuri
Nickil Maveli

Singura modificare care trebuie făcută este că features trebuie să fie inițializat la un dict ({}) în loc de un list ([]), iar apoi se va putea completa conținutul său.

Adresa TypeError a fost pentru că word_features este o listă de șiruri de caractere pe care ați încercat să le indexați folosind o listă, iar listele nu pot avea indici de șiruri de caractere.

features={}
for w in word_features:
    features[w] = (w in words)

Aici, elementele prezente în word_features constituie keys de dicționar, features care conțin valori booleene, True în funcție de faptul că același element apare sau nu în words (care deține elemente unice datorită apelării lui set()) și False pentru situația inversă.

Comentarii

  • Chiar ar trebui să adăugați de ce, modificarea este atât de minimalistă, încât nimeni nu o va vedea, dacă nu este deja conștient de eroare. Așa că mai bine adăugați un text descriptiv. –  > Por Wolf.
  • @ Wolf: Este greșeala mea. Am fost puțin grăbit și, prin urmare, nu am putut oferi explicația necesară. –  > Por Nickil Maveli.
  • Subliniați dict și list, , dar acest lucru nu este automat sinonim cu {} și [] pentru utilizatorii care nu cunosc python… –  > Por Wolf.
Raja Sattiraju

Ați încercat să indexați o listă features cu un șir de caractere și acest lucru nu este posibil cu python. Indicii listelor pot fi doar numere întregi. Ceea ce aveți nevoie este un dictionary.

Încercați să utilizați un defaultdict ceea ce înseamnă că, chiar dacă o cheie nu se găsește în dicționar, în loc de un KeyError este aruncat, se creează o nouă intrare

from collections import defaultdict

features = defaultdict()
for w in word_features:
    features[w] = [w in words]

Comentarii

  • You can also try — de ce „de asemenea”, la ce alternativă te referi? Cea mai simplă soluție? 😉 –  > Por Wolf.
  • Întrebarea a primit deja un răspuns înainte de a putea să o trimit pe a mea. Deci, cuvântul „de asemenea” –  > Por Raja Sattiraju.
  • Da, dar poate că răspunsul deja dat este slab (chiar cred asta): aruncând o bucată de cod și spunând încercați asta nu este de ajutor, vezi comentariul meu. Aș sugera să încorporați soluția evidentă a problemei în răspunsul dvs. și să spuneți mai multe cuvinte despre greșeala pe care a făcut-o OP. O altă alternativă este să faci un link către răspuns (dar nu prea sugerez asta aici). –  > Por Wolf.