如何使用pyhton知道以txt文件的每个字母开头的名称数量

时间:2019-03-30 15:59:54

标签: python list file tuples

我需要知道如何计算列表中以字母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]开头的单词数。例如。

  • 有3个以A开头的单词。
  • 以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()

3 个答案:

答案 0 :(得分:1)

假设有一个列表名称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开头。 这是找到结果的直接逻辑。

答案 1 :(得分: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'除外,其中所有字母都有一个。您需要在该函数中更新当前字母的值,而不是立即计算整个数组。

答案 2 :(得分:1)

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

使用设置为collection.defaultdictint作为值:使用第一个字母作为dictionary的键,只要有匹配项,就可以增加其值。所以:

from collections import defaultdict

xs设置为xs = defaultdict(int)

for i in lines:正文更改为

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

如果您在xs循环的末尾打印for,则会得到类似的内容:

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

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

您不需要外部方法即可进行计数。