我想创建一个包含文本中所有唯一单词的字典。关键是单词,值是单词的频率
Recording.where('recording_duration_ms::int > ?', 60000)
我期待这样的事情:
dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home']
word_listT = str(' '.join(dtt)).split()
wordsT = {v:k for (k, v) in enumerate(word_listT)}
print wordsT
但是,我收到了这个:
{'we': 2, 'is': 1, 'peace': 2, 'at': 2, 'want': 2, 'our': 3, 'home': 4, 'you': 1, 'went': 1, 'nice': 1}
显然,我滥用功能或做错了。
请帮助
答案 0 :(得分:3)
你正在做的问题是你正在存储单词所在的数组索引而不是这些单词的数量。
要实现这一目标,您只需使用collections.Counter
from collections import Counter
dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home']
counted_words = Counter(' '.join(dtt).split())
# if you want to see what the counted words are you can print it
print counted_words
>>> Counter({'home': 4, 'our': 3, 'we': 2, 'peace': 2, 'at': 2, 'want': 2, 'is': 1, 'you': 1, 'went': 1, 'nice': 1})
一些清理:,如评论中所述
您的str()
不需要 ' '.join(dtt).split()
您也可以删除列表分配并在同一行上执行计数
Counter(' '.join(dtt).split())
关于列表索引的更多细节;首先,你必须了解你的代码在做什么。
dtt = [
'you want home at our peace',
'we went our home',
'our home is nice',
'we want peace at home'
]
注意你这里有19个字; print len(word_listT)
返回19.现在在下一行word_listT = str(' '.join(dtt)).split()
上,您正在列出所有单词,如下所示
word_listT = [
'you',
'want',
'home',
'at',
'our',
'peace',
'we',
'went',
'our',
'home',
'our',
'home',
'is',
'nice',
'we',
'want',
'peace',
'at',
'home'
]
再次数数:19个字。最后一个词是'家'。列表索引从0开始,因此0到18 = 19个元素。 yourlist[18]
是“家”。这与字符串位置或任何内容无关,只与新数组的索引有关。 :)
答案 1 :(得分:1)
试试这个:
from collections import defaultdict
dtt = ['you want home at our peace', 'we went our home', 'our home is nice', 'we want peace at home']
word_list = str(' '.join(dtt)).split()
d = defaultdict(int)
for word in word_list:
d[word] += 1
答案 2 :(得分:0)
enumerate
返回带有索引的单词列表,而不是它们的频率。也就是说,当您创建wordsT字典时,每个v
实际上是k
的最后一个实例的word_listT中的索引。要做你想做的事,使用for循环可能是最直接的。
wordsT = {}
for word in word_listT:
try:
wordsT[word]+=1
except KeyError:
wordsT[word] = 1