【问题标题】:Python - Display one line for each unique wordPython - 为每个唯一单词显示一行
【发布时间】:2016-08-12 15:20:01
【问题描述】:

我正在尝试编写一个 python 代码来计算文本文件中每个单词的频率。代码应该每个唯一单词显示一行。我写的代码显示重复的单词。

import string

text = open('mary.txt','r')
textr = text.read()

for punc in string.punctuation:
    textr = textr.replace(punc, "")

wordlist = textr.split()

for word in wordlist:
    count = wordlist.count(word)
    print word,':',count

我目前的输出是……

are : 1
around : 1
as : 1
at : 2
at : 2
away : 1
back : 1
be : 2
be : 2
because : 1
below : 1
between : 1
both : 1
but : 1
by : 2
by : 2

输出应该只显示一次at : 2be : 2by : 2。我应该在我的代码中进行哪些更改才能发生这种情况?

【问题讨论】:

  • 使用字典或集合。 dict 在这里更有意义,但是为集合重写代码会少一些工作。

标签: python python-2.7


【解决方案1】:

您的代码的问题是您正在创建一个包含所有单词的列表,然后循环遍历它们。您想创建某种只存储唯一单词的数据结构。 dict 是实现此目的的好方法,但事实证明,Python 中有一个专门的集合,称为 Counter,正是为此目的而构建的。

试一试(未经测试):

from collections import Counter
import string

text = open('mary.txt','r')
textr = text.read()

for punc in string.punctuation:
    textr = textr.replace(punc, "")

counts = Counter(textr.split())

for word, count in counts.items():
    print word,':',count

【讨论】:

  • 我收到错误消息for word, count in counts: ValueError: too many values to unpack
  • @AyZhng 抱歉,已修复。
  • 非常感谢您的帮助
【解决方案2】:

作为实现这一点的另一种方法,您可以采用您的解决方案,将所有条目作为 (word, count) 元组添加到一个集合中,然后打印该集合。您可能应该像@smarx 指出的那样重新考虑您的实现,但这将使用您的本机代码解决问题。

【讨论】:

    【解决方案3】:

    你可以试试这样的:

    import string
    
    frequency = {}
    text = open('mary.txt','r')
    textr = text.read()
    
    for punc in string.punctuation:
        textr = textr.replace(punc, "")
    
    wordlist = textr.split()
    
    for word in wordlist:
        count = frequency.get(word,0)
        frequency[word] = count + 1
    
    frequency_list = frequency.keys()
    
    for words in frequency_list:
        print words,':', frequency[words]
    

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2012-11-09
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多