【问题标题】:How to know the number of names that start with each letter of a txt file using pyhton如何使用pyhton知道以txt文件的每个字母开头的名称数量
【发布时间】:2019-03-30 15:59:53
【问题描述】:

我需要知道如何计算列表中以字母 A、B、C .. Z 开头的单词数。

这里我留下txt文件的阅读部分

#!/usr/bin/python


def main():
  lines = []
  xs = []

  try:
    with open("bin-nombres.txt", 'r') as fp:
      lines = [lines.strip() for lines in fp]

    for i in lines:
      print(i[0])
      xs = counterByLetter(i[0])

    print(xs)
  except EOFError as e:
    print(e)

  finally:
    pass

def counterByLetter(data):
  return [(k, v) for k, v in {v: data.count(v) for v in 'abcdefghijklmnopqrstuvwxyz'}.items()]  

if __name__ == "__main__":
  main()

我必须计算以 [A ... Z] 开头的单词数。例如。

  • 以A开头的单词有3个。
  • 以B开头的单词有20个。
  • 等等..

在这里,我将解决问题的方法。感谢帮助过我的人!!

import string


def main():
  try:
    # this initiates the counter with 0 for each letter
    letter_count = {letter: 0 for letter in list(string.ascii_lowercase)}
    with open("bin-nombres.txt", 'r') as fp:
      for line in fp:
        line = line.strip()
        initial = line[0].lower()
        letter_count[initial] += 1  # and here I increment per word


    #iterating over the dictionary to get the key and the value.
    #In the iteration process the values will be added to know the amount of words.
    size = 0
    for key , value in letter_count.items():
      size += value
      print("Names that start with the letter '{}' have {} numbers.".format(key , value))

    print("Total names in the file: {}".format(size))


  except EOFError as e:
    print(e)


if __name__ == "__main__":
  main()

【问题讨论】:

  • 看起来你的main 应该是一个函数,而不是一个类。
  • 是的,对不起
  • 您的文件数据怎么样?到目前为止,除了读取文件的内容之外,您还尝试过什么?
  • 现在我正在试验 xs = list (filter (lambda x: x [0] == 'a', lines)) 看看以后我是否可以创建一个元组,以便我有类似的东西 ('a', 4), ('b', 1)
  • 对于txt,每一行只有一个单词。是的,它已经按字母顺序排列了。

标签: python list file tuples


【解决方案1】:

因此,根据您更新的答案(每行 1 个单词,已按字母顺序排序),这样的事情应该可以工作:

import string


def main():
  try:
    # this initiates our counter with 0 for each letter
    letter_count = {letter: 0 for letter in list(string.ascii_lowercase)}
    with open("words.txt", 'r') as fp:
      for line in fp:
        line = line.strip()
        initial = line[0].lower()
        letter_count[initial] += 1  # and here we increment per word

    print(letter_count)

  except EOFError as e:
    print(e)


if __name__ == "__main__":
  main()

更新:

很高兴您不只是想要一个现成的解决方案,但是您的代码有一些问题并且有些点不是超级pythonic,这就是我建议按照上述方法进行操作的原因。如果您真的想使用您的解决方案,您需要修复您的 counterByLetter 函数。它的问题是您实际上并没有将结果存储在任何地方,您总是为每个单词返回一个新的结果数组。您可能有一个以“z”开头的单词作为文件的最后一个单词,因此结果将0 作为所有字母的计数,“z”除外,它有一个。您需要更新该函数中当前字母的值,而不是一次计算整个数组。

【讨论】:

  • 您的解决方案效果很好!但我想看看我是否可以用我的解决方案来做到这一点。现在我的解决方案返回我 [('a', 0), ('b', 0), ('c', 0), ('d', 0), ('e', 0), (' f', 0), ('g', 0), ('h', 0), ('i', 0), ('j', 0), ('k', 0), ('l' , 0), ('m', 0), ('n', 0), ('o', 0), ('p', 0), ('q', 0), ('r', 0 ), ('s', 0), ('t', 0), ('u', 0), ('v', 0), ('y', 0), ('x', 0), ('y', 0) , ('z', 1)]
  • @ChrisPerez 我已经更新了我的答案来谈谈修复代码的方法,然后:)
  • @ChrisPerez 此处的任何答案是否有助于您找到解决方案?如果是这样,请将其中一个标记为正确答案。如果没有,请告诉我们缺少什么:)
【解决方案2】:

假设,有一个列表名称list,它有3个元素:

list = ["Geeks", "For", "Triks"]

并且有一个包含 26 个元素的数组。

array = ["0", "0", ......"0", "0"......"0","0"]

array[0]代表以A开头的字数。 ..................... ..................... array[25] 表示以Z 开头的字数。 然后, 如果list[n][0]A 开头,那么您需要将array[0] 增加1。

如果array[5] = 7 则意味着有7 个单词以F 开头。 这是查找结果的简单逻辑。

【讨论】:

  • 您应该始终使用全小写字母命名您的 Python 变量,以免它们与类混淆。
  • 嗨,它显示了以下输出:[('a', 0), ('b', 0), ('c', 0), ('d', 0), ('e', 0), ('f', 0), ('g', 0), ('h', 0), ('i', 0), ('j', 0), (' k', 0), ('l', 0), ('m', 0), ('n', 0), ('o', 0), ('p', 0), ('q' , 0), ('r', 0), ('s', 0), ('t', 0), ('u', 0), ('v', 0), ('y', 0 ), ('x', 0), ('y', 0) , ('z', 1)] 值不会增加
  • 问题是为什么?对于 Z >> ('z', 1) .
  • @ShuvoKarmakar 他向我展示了那个元组 ('z', 1) 因为我的解决方案效果不佳。但我已经设法使用以下方法解决了这个问题:k = {letter: 0 for letter in list (string.ascii_lowercase)}
【解决方案3】:

我建议像这样更改您的代码。

使用collection.defaultdict 设置为int 作为值:使用第一个字母作为dictionary 的键,您可以在每次匹配时增加其值。所以:

from collections import defaultdict

xs设置为xs = defaultdict(int)

for i in lines: 正文更改为

for i in lines:
  xs[i[0]] += 1

如果你在for 循环的末尾打印xs,你会得到类似的东西:

defaultdict(<class 'int'>, {'P': 3, 'G': 2, 'R': 2})

dict 中的键区分大小写,因此,如果需要,请注意转换大小写。

您不需要外部方法来完成计数工作。

【讨论】:

  • 谢谢兄弟!!很简单的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2018-03-15
  • 2017-10-28
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多