Python对在列表中有一个单词的多个副本

时间:2017-05-06 20:32:13

标签: python-2.7 list jython-2.7

所以我有以下代码:

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))

它读取一个文件,然后生成它们出现的单词和频率对。我面临的问题是,当我打印结果时,我没有得到正确的配对数。

如果我有一些输入,我可能得到这样的输出:

  

('和',27),('和',27),('和',27),('和',27),('和',27),('和',27) ,('和',27),..(27次)

这不是我想要的。

相反,我希望它能给出1个输出的单词,只有一个数字,如下所示:

  

('和',27),('能',5),('蝙蝠',6)..等等

那么我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

你应该考虑使用字典。 字典像哈希映射一样工作,因此允许关联索引;以这种方式重复不是问题。

...
  wordfreq = {}
  for w in wordlist: 
    wordfreq[w] = wordlist.count(w)
  return wordfreq

如果您确实需要返回列表,请执行return wordfreq.items()

这种方法的唯一问题是你将不必要地为每个单词多次计算wordlist.count()方法。 要避免此问题,请写下for w in set(wordlist):

编辑其他问题:如果您可以返回列表,只需执行return sorted(wordfreq.items(), key=lambda t: t[1])。如果省略关键部分,结果将按单词first排序,然后按值

排序