2014-05-13 2 views
-1

dict의 char 키와 목록의 char 사이의 비교에 관한 문제가 있습니다. 작업은 텍스트를 읽고 모든 시작 문자를 계산합니다.dict 및 목록의 문자를 비교하는 동안 Python KeyError

bchars = ('i','g','h','n','h') 

0으로 알파벳 및 주파수 기본과 DICT :

가 나는 문자와 목록을

d = dict(dict()) 
    for i in range(97,123): 
    d[i-97]={chr(i):0} 

내가 다음과 같이 확인하고 싶은 번호 :

for i in range(len(bchars)): 
    for j in range(len(d)): 
    if(bchars[i] in d[j]): 
     d[j][chr(i+97)] +=1 
    else: 
     d[j][chr(i+97)] +=0 

목록의 문자가 특정 위치의 키이면 + = 1 else + = if/else 문을 사용하여 KeyError를 우회 할 수 있다고 생각했습니다.

더 좋은 해결책이 있습니까?

+1

미안하지만, 내가 읽고 질문을 여러 번 다시 읽어 시도하고 난 아직도 확실히 당신이 여기 달성 하려는지 이해가 안 돼요. –

답변

1

bchars[i]in d[j]인지 확인하는 것이지만 실제로 사용하는 키는 chr(i+97)입니다.

chr(i+97)bcharsi 번째 문자의 인덱스이지만, 'a'부터 ASCII 문자에 매핑. 왜 이것을 당신의 열쇠로 사용하고 싶습니까?

난 당신이 정말하고 싶은 생각 : 당신이 else+=을 사용할 수 없습니다

for i in range(len(bchars)): 
    for j in range(len(d)): 
     if(bchars[i] in d[j]): 
      d[j][bchars[i]] += 1 
     else: 
      d[j][bchars[i]] = 1 

참고; 당신이 어떻게 문자 그대로 방금 확인했는지 기억하십시오 키가 있는지 여부가 결정되지 않았습니까?

더 광범위하게도 코드는 이해가되지 않습니다.이 코드는 지나치게 복잡하며 파이썬 사전의 진정한 힘을 사용하지 않습니다.

다음
{'a': 0, 'b': 0, 'c': 0, ...} 

간단히 수행 할 수 있습니다 :

for char in bchars: 
    if char in d: 
     d[char] += 1 

파이썬도 제공

{0: {'a': 0}, 1: {'b': 0}, 2: {'c': 0}, ...} 

계산에 직접 사전 매핑 문자를 구축하는 것이 훨씬 더 현명한 것 : d처럼 보이는 a class just for doing this sort of thing.

1

중첩 된 사전은 필요하지 않는 것 : 또한 collections 모듈에 Counter 클래스에서 볼 수도 있습니다

d = [0] * 26 
for c in bchars: 
    d[ord(c)-97] += 1 

.

1
from collections import Counter 

bchars = ('i','g','h','n','h') 
counts = Counter(bchars) 
print(counts) 
print(counts['h']) 

인쇄

Counter({'h': 2, 'i': 1, 'g': 1, 'n': 1}) 
2