我正在尝试在python中编写一个字数统计程序。为此,我使用字典来存储单词的数量。
字典的格式为d [int] = [数组]。
添加单词后,如果单词已存在于dict中,则会删除该单词并附加到下一个键。
执行d [index] .append(word)时,它会以某种方式添加为新密钥。难道我做错了什么?我在Ubuntu上使用python 3.4.3和2.7.9。
def count_words(s, n):
d = {}
d[1] = []
word_array = []
for word in s.split():
if word not in word_array:
d[1].append(word)
word_array.append(word)
else:
keys = list(d.keys())
for key in keys:
if word in d[key]:
index = key+1
d[key].remove(word)
if index in d.keys():
print ('appending %s at %d on %s' % (word, index, d[index]))
d[index].append(word)
#print d[index]
else:
d[index] = list([word])
print ('%s -> %s' % (word, d))
print (d)
def test_run():
"""Test count_words() with some inputs."""
count_words("cat bat mat cat bat cat", 3)
#print count_words("betty bought a bit of butter but the butter was bitter", 3)
#print count_words('london bridge is falling down falling down falling down london bridge is falling down my fair lady', 5)
if __name__ == '__main__':
test_run()
答案 0 :(得分:0)
我花了一些时间才意识到你正在使用什么样的数据结构。颠倒顺序会更有效,并使用collections.Counter
来计算单词;如果您需要反向结构(也就是按计数的单词),您可以在以后构建它:
from collections import Counter, defaultdict
def words_by_count(s):
word_counts = Counter(s.split())
by_count = defaultdict(list)
for word, count in word_counts.items():
by_count[count].append(word)
return by_count
print(words_by_count('cat bat mat cat bat cat'))
打印:
defaultdict(<class 'list'>, {1: ['mat'], 2: ['bat'], 3: ['cat']})
答案 1 :(得分:0)
代码中的问题是你没有破坏循环
for key in keys:
if word in d[key]:
code that removes word from d[key] and inserts it into d[key+1] list
在某个执行点上,字典d
具有以下内容
{1: ['bat', 'mat'], 2: ['cat']}
句子中的下一个单词是bat
,所以你的代码会这样做:
在循环的第一次迭代中,它在bat
中找到d[1]
,将其从那里删除并将该单词追加到d[2]
列表中(此时词典具有适当的内容);
在bat
中找到d[2]
的第二次迭代,然后在d[3]
中删除并创建新列表。
将word
添加到d[index]