Python 对在列表中有一个单词的多个副本
Python pairs have multiple copies of a word in list
所以我有以下代码:
def stripNonAlphaNum(text):
import re
return re.compile(r'\W+', re.UNICODE).split(text)
def readText(fileStub):
words = open(fileStub, 'r').read()
words = words.lower() # Make it lowercase
wordlist = sorted(stripNonAlphaNum(words))
wordfreq = []
for w in wordlist: # Increase count of one upon every iteration of the word.
wordfreq.append(wordlist.count(w))
return list(zip(wordlist, wordfreq))
它读入一个文件,然后将出现的单词和频率配对。我面临的问题是,当我打印结果时,我没有得到正确的配对计数。
如果我有一些输入,我可能会得到这样的输出:
('and', 27), ('and', 27), ('and', 27), ('and', 27), ('and', 27), ('and', 27), ('and', 27),.. (27 times)
这不是我想要的。
我更希望它输出 1 个单词和一个数字,如下所示:
('and', 27), ('able', 5), ('bat', 6).. etc
那么我该如何解决这个问题?
你应该考虑使用字典。
字典像哈希映射一样工作,因此允许关联索引;这样重复就不是问题了。
...
wordfreq = {}
for w in wordlist:
wordfreq[w] = wordlist.count(w)
return wordfreq
如果你真的需要return一个列表,只需return wordfreq.items()
这种方法的唯一问题是您将不必要地为每个单词多次计算 wordlist.count() 方法。
为避免此问题,请编写 for w in set(wordlist):
编辑其他问题:如果您可以 return 列出列表,请执行 return sorted(wordfreq.items(), key=lambda t: t[1])
。如果省略key部分,结果将按word在前,value在后排序
所以我有以下代码:
def stripNonAlphaNum(text):
import re
return re.compile(r'\W+', re.UNICODE).split(text)
def readText(fileStub):
words = open(fileStub, 'r').read()
words = words.lower() # Make it lowercase
wordlist = sorted(stripNonAlphaNum(words))
wordfreq = []
for w in wordlist: # Increase count of one upon every iteration of the word.
wordfreq.append(wordlist.count(w))
return list(zip(wordlist, wordfreq))
它读入一个文件,然后将出现的单词和频率配对。我面临的问题是,当我打印结果时,我没有得到正确的配对计数。
如果我有一些输入,我可能会得到这样的输出:
('and', 27), ('and', 27), ('and', 27), ('and', 27), ('and', 27), ('and', 27), ('and', 27),.. (27 times)
这不是我想要的。
我更希望它输出 1 个单词和一个数字,如下所示:
('and', 27), ('able', 5), ('bat', 6).. etc
那么我该如何解决这个问题?
你应该考虑使用字典。 字典像哈希映射一样工作,因此允许关联索引;这样重复就不是问题了。
...
wordfreq = {}
for w in wordlist:
wordfreq[w] = wordlist.count(w)
return wordfreq
如果你真的需要return一个列表,只需return wordfreq.items()
这种方法的唯一问题是您将不必要地为每个单词多次计算 wordlist.count() 方法。
为避免此问题,请编写 for w in set(wordlist):
编辑其他问题:如果您可以 return 列出列表,请执行 return sorted(wordfreq.items(), key=lambda t: t[1])
。如果省略key部分,结果将按word在前,value在后排序