Как узнать количество имен, начинающихся с каждой буквы текстового файла, используя pyhton - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно знать, как я могу рассчитать количество слов в списке, которые начинаются с буквы A, B, C .. Z.

Здесь я оставляю часть чтения текстового файла

#!/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.
  • 20 слов начинаются с B.
  • и т. Д.

Здесь я оставляю решение проблемы.Спасибо тем, кто помог мне !!

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 ]

1 голос
/ 30 марта 2019

Итак, согласно вашему обновленному ответу (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()

UPDATE:

Хорошо, что вы не просто хотите получить готовое решение, но у вашего кода есть несколько проблем, и некоторые моменты не являются супер-пифоническими, поэтому я предложил сделать это, как описано выше. Если вы действительно хотите использовать свое решение, вам нужно исправить функцию counterByLetter. Проблема в том, что вы на самом деле нигде не храните результаты, вы всегда возвращаете новый массив результатов для каждого слова. Вероятно, у вас есть слово, начинающееся с 'z', как последнее слово в файле, поэтому в результате в качестве числа всех букв будет 0, кроме «z», в котором оно есть. Вам нужно обновить значения для текущей буквы в этой функции, вместо того, чтобы вычислять весь массив сразу.

1 голос
/ 30 марта 2019

Я бы предложил немного изменить ваш код следующим образом.

Используйте collection.defaultdic t , установленное в int в качестве значения: используйте первую букву в качестве ключа словарь вы можете увеличивать его значение при каждом совпадении. Итак:

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 чувствительны к регистру, поэтому при необходимости позаботьтесь о преобразовании регистра.

Вам не нужен внешний метод для подсчета.

1 голос
/ 30 марта 2019

Предположим, что есть имя списка 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. Это простая логика для поиска результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...