【发布时间】:2014-04-10 09:26:47
【问题描述】:
我想使用关键字解包运算符** 格式化和打印字典中的数据。
格式字符串可能引用了许多关键字,而字典可能没有所有必需的关键字。对于缺少的键,我想使用字符串 '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 中的关键字,所以format 不会在data 中搜索请求的关键字,因此不会给data 提供其默认值的机会。
有解决办法吗?
例如,是否有一个替代的format 函数实际上会调用data.get(kwd) 并因此得到N/As?
【问题讨论】:
-
在 Python 3 中,他们添加了您正在寻找的方法:
str.format_map -
我认为您所追求的是stackoverflow.com/questions/19799609/… - 例如,dawg 的回答还允许您设置除空白(“N/A”)以外的默认值...
-
@user2357112 现在我知道了 format_map,我发现了这个stackoverflow.com/questions/17215400/…,它同时适用于 Python 2 和 Python 3。
标签: python dictionary default string-formatting