【问题标题】:counting the word length in a file计算文件中的字长
【发布时间】:2011-02-04 06:21:31
【问题描述】:

所以我的函数应该打开一个文件并计算字长并给出输出。例如,

很多('sample.txt')

长度为 1:2 的单词

长度为 2 的单词:6

长度为 3 的单词:7

长度为 4 的单词:6

我的 sample.txt 文件包含: 这是一个测试文件。长度为 1 的单词有多少? 长度为 3 的单词有多少?我们应该弄清楚! 函数可以做到这一点吗?

到目前为止我的编码,

def many(fname): infile = open(fname,'r')
text = infile.read()
infile.close()
L = text.split()
L.sort
for item in L:
    if item == 1:
        print('Words of length 1:', L.count(item))

谁能告诉我我做错了什么。我调用该函数没有任何反应。这显然是因为我的编码,但我不知道从这里去哪里。任何帮助都会很好,谢谢。

【问题讨论】:

  • 如果python我假设这个?
  • 是的,抱歉忘记添加标签。
  • L.sort 没有达到您的预期;在这里,它获得了对 sort 方法的引用,并且什么也不做(所以语句什么也不做)。如果你加括号把它变成L.sort(),这个函数实际上会被调用(注意你的代码还有其他问题)
  • @OP:看看Counter
  • 请修正缩进。这不可能。

标签: python


【解决方案1】:

您想要获取长度列表(1、2、3、4、...字符)以及文件中具有此长度的单词的出现次数。

所以在L = text.split() 之前,这是一个很好的方法。现在看看 Python 中的 dictionaries,它将允许您存储上述数据结构并遍历文件中的单词列表。只是一个提示...

【讨论】:

    【解决方案2】:

    由于这是家庭作业,我将在此处发布一个简短的解决方案,并将其留作练习,以了解它的作用和原因:)

    >>> from collections import Counter
    >>> text = open("sample.txt").read()
    >>> counts = Counter([len(word.strip('?!,.')) for word in text.split()])
    >>> counts[3]
    7
    

    【讨论】:

      【解决方案3】:

      你对这里有什么期望

      if item == 1:
      

      这里

      L.count(item)
      

      实际发生了什么?使用调试器查看变量值或将它们打印到屏幕上。

      【讨论】:

        【解决方案4】:

        也许还有这个:

        >>> s
        'This is a test file. How many words are of length one? How many words are of length three? We should figure it out! Can a function do this?'
        >>> {x:[len([c for c in w ]) for w in s.split()].count(x) for x in [len([c for c in w ]) for w in s.split()] }
        {1: 2, 2: 6, 3: 5, 4: 6, 5: 4, 6: 5, 8: 1}
        

        【讨论】:

          【解决方案5】:

          让我们一步一步分析你的问题。

          你需要:

          1. 检索文件中的所有单词
          2. 遍历所有单词
          3. 每次找到长度为 N 的单词时,增加计数器 N
          4. 输出结果

          您已经完成了第 1 步:

          def many(fname): 
              infile = open(fname,'r')
              text = infile.read()
              infile.close()
              L = text.split()
          

          然后您(尝试)对单词进行排序,但这没有用。您将按字母数字对它们进行排序,因此它对您的任务没有用处。

          相反,让我们定义一个Python dictionary 来保存字数

              lengths = dict()
          

          @sukhbir 在评论中正确建议使用 Counter 类,我鼓励你去搜索它,但在这个例子中我会坚持使用传统字典,因为我发现熟悉探索图书馆之前的语言。

          让我们继续第 2 步:

              for word in L:
                  length = len(word)
          

          对于列表中的每个单词,我们将当前单词的长度分配给变量length。让我们检查一下计数器是否已经有一个适合我们长度的槽:

                  if length not in lengths:
                      lengths[length] = 0
          

          如果没有遇到长度为length 的单词,我们分配该槽并将其设置为零。我们终于可以执行第三步了:

                  lengths[length] += 1
          

          最后,我们将当前长度为 1 个单位的单词计数器递增。

          在函数的最后,您会发现lengths 将包含一个字长 -> 该长度的字数 的映射。让我们通过打印其内容来验证这一点(第 4 步):

              for length, counter in lengths.items():
                  print "Words of length %d: %d" % (length, counter)
          

          如果你复制并粘贴我写的代码(尊重缩进!!)你会得到你需要的答案。

          我强烈建议你通过Python tutorial

          【讨论】:

          • 答案将是关闭的,因为简单的split() 不会删除他的示例文本中的标点符号。
          • 你是对的。我想他会阅读其他答案..你的答案更加紧凑和优雅,并且摆脱了标点符号,所以如果他愿意,他将能够使用你的代码。如果他是新手,我想,他应该花几个小时研究所有的答案。 :)
          【解决方案6】:

          如果有点矫枉过正,正则表达式库也可能会有所帮助。一个简单的单词匹配 re 可能是这样的:

          import re
          f = open("sample.txt")
          text = f.read()
          words = re.findall("\w+", text)
          

          Words 是一个...单词的列表 :)

          但是,这将无法正确匹配诸如“isn't”和“I'm”之类的单词,因为 \w 仅匹配字母数字。本着作为家庭作业的精神,我想我会把它留给感兴趣的读者,但是 Python Regular Expression 文档作为一个开始是相当不错的。

          那么我按长度计算这些单词的方法是这样的:

          occurrence = dict()
          for word in words:
              try:
                  occurrence[len(word)] = occurrence[len(word)] + 1
              except KeyError:
                  occurrence[len(word)] = 1
          print occurrence.items()
          

          字典(出现)用于存储单词长度及其在文本中出现的位置。 try: 和 except: 关键字处理我们第一次尝试在字典中存储特定长度的单词时,在这种情况下,字典不乐意被要求检索它不知道的内容,并且 except : 获取作为结果引发的异常并存储该单词长度的第一次出现。最后一行打印字典中的所有内容。

          希望这会有所帮助:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-20
            • 1970-01-01
            • 1970-01-01
            • 2011-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多