给定int
s的字典,我试图用每个数字格式化字符串,并对该项目进行复数处理。
样本输入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'
然后dict
通过理解和classes
映射制作一个新的:
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)
如果值是复数,或者如果内容带有逗号,则括号返回内容,表示复数/单数
使用自定义格式化程序:
import string
class PluralFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
if isinstance(key, int):
return args[key]
if key in kwargs:
return kwargs[key]
if '(' in key and key.endswith(')'):
key, rest = key.split('(', 1)
value = kwargs[key]
suffix = rest.rstrip(')').split(',')
if len(suffix) == 1:
suffix.insert(0, '')
return suffix[0] if value <= 1 else suffix[1]
else:
raise KeyError(key)
data = {'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0}
formatter = PluralFormatter()
fmt = "{tree} tree{tree(s)}, {bush} bush{bush(es)}, {flower} flower{flower(s)}, {cactus} cact{cactus(i,us)}"
print(formatter.format(fmt, **data))
输出:
1 tree, 2 bushes, 3 flowers, 0 cacti
更新
如果您使用的是Python
3.2+(str.format_map
已添加),则可以使用使用自定义dict的OP的想法(请参阅注释)。
class PluralDict(dict):
def __missing__(self, key):
if '(' in key and key.endswith(')'):
key, rest = key.split('(', 1)
value = super().__getitem__(key)
suffix = rest.rstrip(')').split(',')
if len(suffix) == 1:
suffix.insert(0, '')
return suffix[0] if value <= 1 else suffix[1]
raise KeyError(key)
data = PluralDict({'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0})
fmt = "{tree} tree{tree(s)}, {bush} bush{bush(es)}, {flower} flower{flower(s)}, {cactus} cact{cactus(i,us)}"
print(fmt.format_map(data))
输出:同上。
问题内容: 我想像这样分割一个字符串 与。但是当我尝试拆分时,我得到了 我尝试将空字符串拆分后用于检查空字符串,但在android中不起作用。这是我的代码: 我认为有一种方法可以像这样拆分:但无法弄清楚如何。 谢谢您的帮助! 问题答案: 由于to的参数是一个正则表达式,因此您可以查找一个或多个空格()而不是一个空格()。
问题内容: 我正在尝试用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一只狗和一只山羊”。 但是,它不会产生“我有一只狗,一只山羊和一只猫”,而是会产生“我有一只猫,一只猫和一只猫”。在JavaScript中是否可以同时用多个其他字符串替换多个字符串,以便产生正确的结果? 问题答案: 具体解决方案 您可以使用一个函数替换每个函数。 概括它 如果您要动态维护正则表达式并仅将将来的交换添加
我正在尝试用多个其他单词替换字符串中的多个单词。绳子是“我有一只猫,一只狗,和一只山羊。” 然而,这并不产生“我有一只狗,一只山羊,一只猫”,而是产生“我有一只猫,一只猫,一只猫”。是否可以在JavaScript中同时用多个其他字符串替换多个字符串,从而产生正确的结果?
问题内容: 我的字符串带有多余的空格,每当有多个空格时,我希望它只有一个。 任何人?我尝试搜索Google,但没有任何帮助。 谢谢 问题答案: 像这样:
问题内容: 如何用一个或多个空格或制表符爆炸字符串? 例: 我想使它成为一个数组。 问题答案:
如何将过滤器列表拆分为单个过滤器元件?split2String在线程“main”java.util.regex中导致:异常。PatternSyntaxException:索引10或(|和)附近的未闭合组(