2016-06-27 2 views
0

나는 독자적으로 잘 작동하는 함수를 가지고 있지만 다른 함수 내에서 사용하려고 할 때 중요한 오류가 발생합니다. 큰 문맥을 설명하기보다는 오류가 발생한 부분 인 손 [문자]을 변경하는 것이 더 쉬울 것이라고 생각했습니다. 어떤 경우에는 hand [letter]를 hand.get (letter, None)로 바꿀 수 있지만 del 연산자와 함께 사용할 수는 없으므로 오류가 발생합니다. 어떤 아이디어? 키가 당신이 기본값을 사용하는 경우,이 오류가 발생하지 않는 존재하지 않는 경우에, 그래서파이썬에서 del 키 [value]가 아닌 사전에서 값 쌍을 제거하는 또 다른 방법이 있습니까?

hand = {'r': 2, 'a': 3, 'p': 2, 'e': 1, 't': 1, 'u':1} 
word = 'rapture' 

def update_hand(hand, word): 
"""This function loops through letters, and if the letter is in the \ 
hand, it reduces the corresponding int value by one, until there is \ 
no longer that letter in the hand, then it deletes the key,value pair \ 
all together""" 
    letters = set(word) 
    for letter in letters: 
     if letter in hand.keys(): 
      hand[letter] = hand[letter]-1 
     if hand[letter] <= 0: 
      del hand[letter] 
    return hand 
+1

'pop' 사전 멤버 함수를 사용하십시오 – jmetz

답변

5

사용 .popNone 말 :

hand.pop(letter, None) 
#    ^pops None when the key letter does not exist 

이미 수표를 가지고 있기 때문에 당신의 if 조건 중 하나에 같은 키의 존재는, 당신은 간단하게 수행 할 수 있습니다

for letter in letters: 
    if letter in hand: # same as letter in hand.keys() 
     hand[letter] = hand[letter] - 1 
     if hand[letter] <= 0: 
      hand.pop(letter, None) # del hand[letter] should not throw errors in this case 
0

함수는 "그 자체에서 잘 작동하지만 호출 할 때 제기하는 경우 다른 기능 "을 수행하면 가장 먼저 할 일은 인 이유입니다. 두 번째 경우에 문제가있는 것입니다. 다른 말로하면 programming by accident의 표준적인 예입니다. 장기적으로 결코 작동하지 않는다는 것을 알고 있습니다.

이제 함수의 코드에있는 KeyError에 대한 명백한 원인이 있습니다. 함수의 입력에 의존하지 않는 함수입니다. 먼저 존재 여부를 확인하지 않고 키를 삭제하려고 시도합니다 (if hand[letter] <= 0: 문). hand 매개 변수에 대해 공백 문자를 전달하면 함수가 이 아니고이 아닌 것으로 나타납니다.

+0

이 함수는 손에 param이 param이라는 단어의 모든 문자를 가지고 있다고 가정합니다. 단어가 유효한지 확인하기위한 다른 기능이 있습니다. 즉 단어가 단어 목록에 있고 글자만으로 구성되어 있다는 것입니다. 함수는 나보다 훨씬 경험이 많은 프로그래머가 작성한 단위 테스트를 통과했습니다. 나는 사람들이 여기에서 질문에 대해 까다 롭기 때문에 그것을 포함하지 않았다. 재미있는 일은 내가 함께하려고 할 때 일어난다. 의견을 보내 주셔서 감사합니다. – sampy

관련 문제