这个问题可以通过多种方式解决,但这个问题与多态性有关。是否可以多态化Counter()类,所以当Counter()中没有这样的键时,实例字符串格式会返回0?基本上需要使代码的最后一行起作用。
from collections import Counter
VOWELS = 'aeiou'
context = 'Computing is cool'
cnt = Counter()
for letter in context:
if letter in VOWELS:
cnt[letter] += 1
print('o-{o}, i-{i}, o-{o}'.format(**cnt))
# I'd like to make this line to work :
#print('a-{a}, e-{e}, i-{i}, o-{o}, u-{u}'.format(**cnt))
输出:
o-3, i-2, u-1
理想的输出:
a-0, e-0, i-2, o-3, u-1
答案 0 :(得分:3)
这不是更改Counter
的情况。 **
解压缩会将您的Counter
转换为常规字典,缺少密钥时默认值为0。 (至少,它会在早期版本中转换您的Counter
现在; there was a bug,因此如果您在早期的Python版本上尝试**
代码并且它似乎有效,那就是这是为什么。)
而不是**
,请使用format_map
,它将直接使用您的Counter
:
print('o-{o}, i-{i}, o-{o}'.format_map(cnt))
答案 1 :(得分:1)
当
static_cast<std::reference_wrapper<const island>(*)(const island&)>(std::cref<island>)
实例中没有这样的键时,字符串格式会返回0?
但这不是问题所在。问题是Counter()
只会解包现有元素。
您可以做的是为所有**cnt
初始化计数器的计数为零,然后解压缩:
VOWELS
现在解包将会选择这些元素,即使它们有cnt = Counter({i:0 for i in 'aeiou'})
个计数。循环执行后,0
:
print
将返回您想要的结果:
print('a-{a}, e-{e}, i-{i}, o-{o}, u-{u}'.format(**cnt))