gpt4 book ai didi

python - 复数字符串格式

转载 作者:IT老高 更新时间:2023-10-28 20:37:20 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com