Counter()和字符串格式

时间:2017-12-11 18:16:45

标签: python python-3.x string-formatting

这个问题可以通过多种方式解决,但这个问题与多态性有关。是否可以多态化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

2 个答案:

答案 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))
相关问题