给定一个 int
的字典,我正在尝试用每个数字和项目的复数形式格式化一个字符串。
示例输入dict
:
data = {'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0}
示例输出 str
:
'My garden has 1 tree, 2 bushes, 3 flowers, and 0 cacti'
它需要使用任意格式的字符串。
我想出的最佳解决方案是一个 PluralItem
类来存储两个属性,n
(原始值)和 s
(如果是复数则为字符串 's'
,如果不是则为空字符串 ''
)。子类化为不同的复数方法
class PluralItem(object):
def __init__(self, num):
self.n = num
self._get_s()
def _get_s(self):
self.s = '' if self.n == 1 else 's'
class PluralES(PluralItem):
def _get_s(self):
self.s = 's' if self.n == 1 else 'es'
class PluralI(PluralItem):
def _get_s(self):
self.s = 'us' if self.n == 1 else 'i'
然后通过理解和一个 classes
映射创建一个新的 dict
:
classes = {'bush': PluralES, 'cactus': PluralI, None: PluralItem}
plural_data = {key: classes.get(key, classes[None])(value) for key, value in data.items()}
最后,格式字符串和实现:
formatter = 'My garden has {tree.n} tree{tree.s}, {bush.n} bush{bush.s}, {flower.n} flower{flower.s}, and {cactus.n} cact{cactus.s}'
print(formatter.format(**plural_data))
输出以下内容:
My garden has 1 tree, 2 bushes, 3 flowers, and 0 cacti
对于这样一个毫无疑问的普遍需求,我犹豫是否要放弃这样一个复杂的解决方案。
有没有办法使用内置的 format
方法和最少的附加代码来格式化这样的字符串?伪代码可能类似于:
"{tree} tree{tree(s)}, {bush} bush{bush(es)}, {flower} flower{flower(s)}, {cactus} cact{cactus(i,us)}".format(data)
如果值是复数,或者如果内容有逗号,则括号返回内容,表示复数/单数
最佳答案
查看 inflect package .它将使事物多元化,并进行大量其他语言技巧。有太多情况需要自己特例!
来自上面链接中的文档:
import inflect
p = inflect.engine()
# UNCONDITIONALLY FORM THE PLURAL
print("The plural of ", word, " is ", p.plural(word))
# CONDITIONALLY FORM THE PLURAL
print("I saw", cat_count, p.plural("cat",cat_count))
对于您的具体示例:
{print(str(count) + " " + p.pluralize(string, count)) for string, count in data.items() }
关于python - 复数字符串格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21872366/