2013-09-05 4 views
2

편지 발생 횟수를 계산하여 인쇄하려고합니다. 이것은 내가 지금까지 가지고있는 것입니다 :파이썬 문자 계산하기

def histogram(L): 
    d = {} 
    for x in L: 
     for letter in x: 
     if letter in d: 
      d[letter] += 1 
     else: 
      d[letter] = 1 
    for i in range(len(d)): 
     print('{} | {}'.format(d, d[i])) # GETTING ERRORS ON THIS LINE 
    return d 
histogram(open('cipher.txt')) 

어떤 이유로 나는 그 라인에 오류가 발생합니다. 어떻게 올바르게 인쇄 할 수 있습니까?

EDIT : 솔루션 내 Martijn! 소품! 하지만 알파벳 순서로 사전을 정렬하는 방법을 아는 사람이 있습니까?

+2

** 어떤 오류가 있습니까? –

+0

'd'는 사전입니다. 색인을 생성하려고합니다. –

답변

6

d사전이며 목록이 아닙니다. 키 위에 반복하십시오.

for key in d: 
    print('{} | {}'.format(key, d[key])) 

또는 KeyError 예외가 발생합니다.

collections.Counter() class; 카운팅 딕셔너리입니다.

from collections import Counter 

def histogram(L): 
    d = Counter(letter for line in L for letter in x) 
    for letter in d: 
     print('{} | {}'.format(letter, d[letter])) 
    return d 
+0

고마워요, 단 한가지 ... d [key]를 정확하게 인쇄하는 것처럼 실제 문자를 인쇄하는 방법은 어떨까요? 그러나 인쇄 할 때는 그냥 전체 사전을 인쇄합니다 .. – NoviceProgrammer

+0

@NoviceProgrammer : 대신'key '를 인쇄하십시오. –

+0

오, 너무 바보 같은데 ... 기다려! 고마워! 빨리 받아들이고 upvoting 것입니다 – NoviceProgrammer

0

그냥 재미로 코드를 단순화 할 수 있습니다. 초기 문자열에서 set()을 사용하여 고유 한 문자 목록을 얻은 다음 목록의 count 메서드를 사용할 수 있습니다.

def histogram(L): 
    d = {letter:L.count(letter) for letter in set(L)} 
    for key in d: 
     print "{} | {}".format(key, d[key]} 
+0

이것은 매우 비효율적이며 'L'이 단지 문자의 목록이라고 가정합니다. –

관련 문제