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在后排序