0

다음을 수행하는 좀 더 파이썬적인 방법? 이 예제에서는 키가 수정되지 않은 버전 인 키 - 값 쌍이 될 주석 (dict)을 작성하려고 시도하고 값은 키가 인수로 전달 된 함수의 반환 값입니다.목록 이해력이 있지만 사전은 있습니까?

def func(word): 
    return word[-1:-6:-1].upper() 

subs = { 
    'ALLOWED': ['one', 'two'], 
    'DISALLOWED': ['three', 'four'] 
} 

comments = {} 
for sub in subs['ALLOWED']: 
    # reverse and uppercase 
    comments[sub] = func(sub) 

print(comments) 

누구나 권장 사항이 있습니까? 이 작업을 수행하는 것이 중요하지는 않지만 파이썬 관용구와 코드를 파이썬으로 만드는 방법을 배우는 것을 좋아합니다. 감사!

답변

4

사용을 대신 for 루프에 사전을 구축하는 dict comprehension :

comments = {key: func(key) for key in subs['ALLOWED']} 
+1

을 subs : '허용', 'subsize ['허용 된 ']))'아니, 더 이상 Python, 그냥 옵션. 나는 실생활에서 이해력을 선호한다고 생각하는데, 이것이 대답이 아닌 이유입니다. :-) – ShadowRanger

+0

@ShadowRanger 전혀 나쁘지 않습니다. 이 특정 유스 케이스의 차이점을 많이 만들지는 않겠지 만, 귀하의 버전이 광산보다 성능이 좋을 것이라고 생각합니다 (아직 테스트하지는 않았지만). 비록 당신이 말했듯이, 확실히 더 pythonic;) – elethan

+0

Yar. 내 "솔루션"에 대한 나의 주된 반대는 그것이 DRY를 위반한다는 것입니다 (그것은''허용 ''을 두 번 봅니다). 작은 입력에 대해서는 확실히 승리 할 것이고 거대한 입력에 대해서는 더 빠르다.하지만 관련성이 없다. – ShadowRanger

0

루프를 제거하고 사전 이해와 함수 내에서 교체하십시오. 그런 다음 간단히 반환 할 수 있습니다.

또한, 복잡한 [-1:-6:-1] 슬라이스 당신이 사용하고 있지, [::-1]와 문자열 word을 취소 할 수 있습니다 :

def func(words): 
    return {word: word[::-1].upper() for word in words} 

을이 같은 일 산출 : 건축에 대한 이해를 피하고, 또는

comments = func(subs['ALLOWED']) 
print(comments) 
# {'two': 'OWT', 'one': 'ENO'} 
관련 문제