2012-02-11 4 views
2

"카테고리가 있으면 카테고리 아이콘을 가져오고, 그렇지 않으면 ''을 반환합니다."라고 말하고 싶습니다. dict에 get() 메서드를 사용하여 서브 값을 얻습니다.

나는 문자열에 아이콘을 추가 할을하고 있어요 : 어떤 카테고리가없는 경우

'Icon: %s' % venue.get('category', '').get('icon', 'No Icon') 

물론, get() 오류가 발생합니다. 여기에 몇 가지 다른 잘못된 방법이 있습니다 :

venue.get('category[icon]', '') 

venue.get('category', '')['icon'] 

희망을 갖고 내가하려는 것을 보여줍니다. if/else 문없이이 작업을 수행 할 수있는 방법이 있습니까?

'Icon: %s' % venue.get('category', {}).get('icon', 'No Icon') 

그러나, 그 빈 사전 생성이 실행될 때마다의 오버 헤드를 발생 :

+1

if/else 문을 사용하지 않는 이유는 무엇입니까? 코드의 가독성을 향상시키고 원하는대로 정확하게 수행 할 수 있습니다. –

답변

2

당신은 기본 값을 빈 사전을 만들 수 있습니다. 성능이 당신에게 중요하다면, 노력이 접근하는 여러 가지 방법이 있습니다

'Icon: %s' % (venue['category'].get('icon', 'No Icon') if 'category' in venue else 'No Icon') 

있습니다 (이 발견되는 경우는 위의 'category' 두 조회를한다) 위의 것보다 아마도 훨씬 더 효율적입니다.

+0

첫번째 스 니펫에서는'venue.get (...) '대신'venue.setdefault ('category ', {}) ...를 사용할 수 있습니다. 그런 다음 카테고리와 관련된 사전이 없으면 첫 번째 액세스에서 새 카테고리가 작성됩니다. 다음은 [참조 문서]입니다 (http://starship.python.net/~mwh/hacks/setdefault.html). – Seth

+1

또한 이전 행에서 빈 dict을 선언하기 만하면 여분의 오버 헤드 문제를 해결할 수 있습니다. 그렇게하면 같은 딕트를 반복적으로 참조 할 수 있습니다. –

+2

글쎄, 만약 그렇게한다면 당신은'EMPTY_DICT = {}'와 같이 global * once *를 선언하기를 원할 것이다. 그렇지 않으면 이전 줄에 새로운 빈 사전을 생성 할 것이다. –

관련 문제