NLTK python error: "TypeError: 'dict_keys' object is not subscriptable"
Question:
I am following instructions for a class homework assignment and I am supposed to look up the top 200 most frequently used words in a text file.
Here’s the last part of the code:
fdist1 = FreqDist(NSmyText)
vocab=fdist1.keys()
vocab[:200]
But when I press enter after the vocab 200 line, it returns:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object is not subscriptable
Any suggestions on how to fix this so it can correctly return an answer?
Answers:
Looks like you are using Python 3. In Python 3 dict.keys()
returns an iterable but not indexable object. The most simple (but not so efficient) solution would be:
vocab = list(fdist1.keys())[:200]
In some situations it is desirable to continue working with an iterator object instead of a list. This can be done with itertools.islice()
:
import itertools
vocal_iterator = itertools.islice(fdist1.keys(), 200)
To print the most frequently used 200 words use:
fdist1.most_common(200)
The above line of code will return the 200 most frequently used words as key-frequency pair.
If your using python 3 try:
fdist1.most_common(200)
instead, to get the 200 most frequent words.
I am using python 3.5
and I meet the same problem of TypeError
.
Using vocab = list(fdist1.keys())
does not give me the top 50 most frequently used words.
But fdist1.most_common(50)
does.
Further,if you just want to show those top 50 words not with their frequency,you can try :
[word for (word, freq) in fdist1.most_common(50)]
fdist1 = FreqDist(NSmyText)
vocab=fdist1.keys()
This code is using in Python2.7.
So you should do some change.
dic.keys() returns an iteratable. So using:
list(fdist1.keys())
If you want to get elements as keys and values (word and frequency), you can use:
list(fdist1.items())[:200]
I am following instructions for a class homework assignment and I am supposed to look up the top 200 most frequently used words in a text file.
Here’s the last part of the code:
fdist1 = FreqDist(NSmyText)
vocab=fdist1.keys()
vocab[:200]
But when I press enter after the vocab 200 line, it returns:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object is not subscriptable
Any suggestions on how to fix this so it can correctly return an answer?
Looks like you are using Python 3. In Python 3 dict.keys()
returns an iterable but not indexable object. The most simple (but not so efficient) solution would be:
vocab = list(fdist1.keys())[:200]
In some situations it is desirable to continue working with an iterator object instead of a list. This can be done with itertools.islice()
:
import itertools
vocal_iterator = itertools.islice(fdist1.keys(), 200)
To print the most frequently used 200 words use:
fdist1.most_common(200)
The above line of code will return the 200 most frequently used words as key-frequency pair.
If your using python 3 try:
fdist1.most_common(200)
instead, to get the 200 most frequent words.
I am using python 3.5
and I meet the same problem of TypeError
.
Using vocab = list(fdist1.keys())
does not give me the top 50 most frequently used words.
But fdist1.most_common(50)
does.
Further,if you just want to show those top 50 words not with their frequency,you can try :
[word for (word, freq) in fdist1.most_common(50)]
fdist1 = FreqDist(NSmyText)
vocab=fdist1.keys()
This code is using in Python2.7.
So you should do some change.
dic.keys() returns an iteratable. So using:
list(fdist1.keys())
If you want to get elements as keys and values (word and frequency), you can use:
list(fdist1.items())[:200]