python - 复数字符串格式

标签 python string customization string-formatting

给定一个 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/

相关文章:

python - 如何在Python循环中将加载的表分配给不同的变量?

c# - 在长字符串中查找所有以@@开头并以@@结尾的单词

java - 如何获取字符串数组中的下一个按钮

vim - 重新映射:Wq to :wq in vim

php - 如何根据初始页面上的选择加载自定义样式表?

customization - 我可以自定义 Azure Service Fabric vm 节点吗?

python - 运行pip的正确方法

python - Keras 不能添加一个数字数组,产生一个标量吗?

python - 如何运行需要 app_context 的 apscheduler 作业

java - String.split 导致最后一个索引换行