2014-03-07 2 views
2

키워드 압축 해제 연산자 **으로 사전의 데이터를 형식화하고 인쇄하려고합니다.키워드 압축 해제로 defaultdict 형식 지정 **

형식 문자열은 많은 키워드를 참조 할 수 있으며 사전에 필요한 모든 키가 없을 수 있습니다. 누락 된 키에 대해서는 'N/A'문자열을 기본값으로 사용하고 싶습니다.

defaultdict을 사용하여이 기본 문제에 대한 현명한 해결책을 원합니다.

다음은 일반 글꼴 dict을 사용하는 첫 번째 해결책입니다.

# Cumbersome solution with dict 
format_str = '{date} {version} {comment}' 
data  = dict() 

data['date'] = 'today' 
data['version'] = 'v1' 
data['comment'] = 'N/A' # I want to avoid this 

print format_str.format(**data) 
# prints: today v1 N/A 

누락 된 키에 'N/A'를 명시 적으로 지정하지 않으려합니다.

다음 솔루션은 키워드의 목록을 작성하는 형식 문자열을 정기적 dict을 사용하여 분석 :

# Another solutions with handmade defaults for missing keys 
format_str = '{date} {version} {comment}' 
data  = dict() 

data['date'] = 'today' 
data['version'] = 'v1' 

import re 
for k in re.findall('{(\w+)}', format_str): 
    if k not in data: 
     data[k] = 'N/A' 

print format_str.format(**data) 
# prints: today v1 N/A 

형식 문자열의 구문이 훨씬 더 때문에 re.findall와이 솔루션은 정말 우아하고도 강력하지 않다 이상 {(\w+)}보다 복잡합니다.

다음 해결책은 명백한 이유로 실패하지 않은 경우 가장 좋아하는 해결책입니다. 여기

# Failed attempt with defaultdict 
from collections import defaultdict 
format_str = '{date} {version} {comment}' 
data  = defaultdict(lambda x:'N/A') 

data['date'] = 'today' 
data['version'] = 'v1' 

print format_str.format(**data) 
# raises KeyError: 'comment' 

문제는 **data에게 기본 가치를 제공 할 수있는 기회를 제공하지 않습니다 따라서 실제로 data에 키워드를 압축을 풉니 그래서 format 요청 된 키워드에 대한 data을 검색하지 않고 있다는 점이다.

해결 방법이 있습니까? 실제로 data.get(kwd)을 호출하여 N/A을 얻는 대체 format 함수가 있습니까?

+2

파이썬 3에서, 그들은 당신이 찾고있는 방법을 정확하게 추가했다 : ['str.format_map'] (http://docs.python.org/3 /library/stdtypes.html#str.format_map) – user2357112

+0

당신이 생각하는 것은 http://stackoverflow.com/questions/19799609/leaving-values-blank-if-not-passed-in-str-format/입니다. - 도그의 대답은 예를 들어 공백 ("N/A") 이외의 기본값을 설정할 수도 있습니다 ... –

+0

@ user2357112 format_map을 알았으니 http://stackoverflow.com/questions/17215400/ python-format-string-unused-named-arguments - 파이썬 2와 파이썬 3 모두를 처리합니다. – wap26

답변

2

string.Formatter.vformat()을 사용하고 defaultdict을 전달하십시오. 이 경우 포장을 풀고 키워드 혜택되지 않습니다 그러나 포매터를 사용하여

from collections import defaultdict 
from string import Formatter 

fmtr = Formatter() 
format_str = '{date} {version} {comment}' 
data = defaultdict(lambda: 'N/A') 

data['date'] = 'today' 
data['version'] = 'v1' 

print fmtr.vformat(format_str,(), data) 
+0

그런 함수가 없습니다. – user2357112

+0

죄송합니다. 의미는 다음과 같습니다. http://docs.python.org/2/library/string.html#string.Formatter.vformat – cha0site

-1

좋은 솔루션은 이미

주어집니다. 서식 문자열에 인쇄 할 키를 지정해야합니다.
format_str = '{date} {version} {comment}' 

그리고 이미 의도 한대로 DICT

은 DICT하는 기본값을 사용하여이

>>> d 
{'version': 'v1', 'date': 'today'} 

처럼 DICT 위해 이렇게 키워드와 값의 매핑을

을 유지합니다.수() 당신이 (당신이 형식 문자열했던 것처럼) 한 곳에서 키워드 관리를 원하는 경우, 나는이

>>> f=lambda x: (x.get('date'),x.get('version'),x.get('comment','N/A')) 
>>> print '{} {} {}'.format(*f(d)) 
today v1 N/A 

또는이

>>> f=lambda x: '{} {} {}'.format(x['date'],x['version'],x.get('comment','N/A')) 
>>> print f(d) 
today v1 N/A 

같은 것을 시도 할 것이다

>>> print '{} {} {}'.format(d['date'],d['version'],d.get('comment','n/a')) 
today v1 n/a 

이익은 더 적다. 수입은 적다.