2013-09-06 1 views
0

Я делаю программу, которая читает файл, и печатает, сколько из каждой отдельной буквы оно содержит, если оно есть. Если файл содержит в нем «hello world», я хочу, чтобы он был напечатан 1h, 1e, 3l, 2o, 1w, 1r, 1l и т. Д. Это не рабочий проект или что-то еще, я делаю это из интереса. Я не мог найти код примера, который делает это, поэтому я думал, что я бы спросил здесь :) Хотелось бы узнать, как должен выглядеть мой код.Программа не распечатает правильное количество букв в файле

a1 = 0 
b1 = 0 
c1 = 0 
d1 = 0 
e1 = 0 
f1 = 0 
g1 = 0 
h1 = 0 
i1 = 0 
j1 = 0 
k1 = 0 
l1 = 0 
m1 = 0 
n1 = 0 
o1 = 0 
p1 = 0 
q1 = 0 
r1 = 0 
s1 = 0 
t1 = 0 
u1 = 0 
v1 = 0 
w1 = 0 
x1 = 0 
y1 = 0 
z1 = 0 
with open("song.txt") as f: 
    for line in f: 
     if line == "a" or line == "A": 
      a1 = a1 + 1 
     if line == "b" or line == "B": 
      b1 - b1 + 1 
     if line == "c" or line == "C": 
      c1 = c1 + 1 
     if line == "d" or line == "D": 
      d1 = d + 1 
     if line == "e" or line == "e": 
      e1 = e1 + 1 
     if line == "f" or line == "F": 
      f1 = f1 + 1 
     if line == "g" or line == "G": 
      g1 = g1 + 1 
     if line == "h" or line == "H": 
      h1 = h1 + 1 
     if line == "i" or line == "I": 
      i1 = i1 + 1 
     if line == "j" or line == "J": 
      j1 = j1 + 1 
     if line == "k" or line == "K": 
      k1 = k1 + 1 
     if line == "l" or line == "L": 
      l1 = l1 + 1 
     if line == "m" or line == "M": 
      m1 = m1 + 1 
     if line == "n" or line == "N": 
      n1 = n1 + 1 
     if line == "o" or line == "O": 
      o1 = o1 + 1 
     if line == "P" or line == "p": 
      p1 = p1 + 1 
     if line == "q" or line == "Q": 
      q1 = q1 + 1 
     if line == "r" or line == "R": 
      r1 = r1 + 1 
     if line == "S" or line == "s": 
      s1 = s1 + 1 
     if line == "T" or line == "t": 
      t1 = t1 + 1 
     if line == "u" or line == "U": 
      u1 = u1 + 1 
     if line == "v" or line == "V": 
      v1 = v1 + 1 
     if line == "w" or line == "W": 
      w1 = w1 + 1 
     if line == "x" or line == "X": 
      x1 = x1 + 1 
     if line == "y" or line == "Y": 
      y1 = y1 + 1 
     if line == "z" or line == "Z": 
      z1 = z1 + 1fwef 
print(a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1) 

ответ

3

Это будет:

  • Читать весь файл как символы нижнего регистра,
  • Extract все символы найдены в списке и отсортировать их в алфавитном,
  • печати каждого персонажа, и это явление сосчитать.

    from collections import Counter 
    with open('song.txt') as f: 
    count = Counter(f.read().lower()) 
    keys = list(count) 
    keys.sort() 
    for x in keys: 
        print '{0}: {1} times'.format(x, count[x]) 
    
+0

Как я могу получить его на печать каждого входа на линии, как a1 b2 c5 – R337

+0

Это должно сделать это .. – Aesthete

+0

Yep спасибо, что один работал только я хочу, чтобы напечатать в алфавитном порядке, это возможно? Так как словарь в случайном порядке – R337

0

Попробуйте это ... Это даст индивидуальный подсчет Прописные и строчные буквы.

import string 
fp=open('song.txt','r') 
file_list=fp.readlines() 
freqs = {} 
for line in file_list: 
    for char in line: 
     line=filter(lambda x:x in strings.letters, line.lower()) 
     if char in freqs: 
      freqs[char] += 1 
     else: 
      freqs[char] = 1 
for item in freqs: 
    print item, freqs[item] 

или иначе конвертировать строку в нижний регистр после цикла for только для небольших букв.

+0

Эй, Апурва, похоже, делает трюк, за исключением того, что я не знаю, как заставить его распечатывать каждую букву на уникальной строке, поэтому первая строка будет указывать «a1», вторая строка будет «b3» и т. Д. – R337

+1

Я отредактировал ответ, пожалуйста, проверьте. – no1

+0

Спасибо, работает безупречно сейчас :) – R337

0

Ваш подход, вероятно, будет работать с несколькими модификациями, но с ним действительно сложно и трудно справиться (не говоря уже о склонности к ошибкам). То, что вы, вероятно, хотите сделать, это использовать структуру данных Python, называемую словарем , которая связывает ключ (букву) со значением (счетчиком). Таким образом, вы могли бы сделать что-то вроде:

letters = {} 
with open("song.txt") as f: 
    for c in f.read(): 
     c = c.lower() 
     if "a" <= c <= "z": 
      if c not in letters: 
       letters[c] = 0 
      letters[c] += 1 
for c, n in sorted(letters.items()): 
    print("{0}{1}".format(c, n)) 

Обратите внимание, что f.read() читает файл всего в память, и цикл for c in f.read() затем перебирает каждый персонаж в отдельности. Если вы просто считаете символы, нет необходимости разбивать файл на строки.

Это общий шаблон в Python, и вы найдете стандартную библиотечную утилиту, называемую Counter, которая делает большую часть этой работы для вас (в другом ответе здесь показано, как ее использовать).

+0

Эй, это отлично работает. Я все еще ищу больше способов сделать это для своего личного проекта, спасибо! – R337