python - 根据值使句子/单词复数
问题描述
我想知道是否有一种首选的或至少更具可读性/漂亮/pythonic的方式来根据放入的数据来制作复数句子。
这就是我现在的做法
ret = f'Done! {deleted} entr{"y was" if deleted == 1 else "ies were"} removed.'
我知道这行得通,但是当我去阅读它时,它就坐不住了。我想过要么制作一个函数,要么使用一个 dict-switch(这是我有点喜欢的东西),但也许有人知道更好的方法。
我尝试过的解决方案:
使用字典
plural = {1:'y was'}
ret = f'Done! {deleted} entr{plural.get(deleted, "ies were")} removed.'
使用函数
def plural(num: int):
return 'y was' if num == 1 else 'ies were'
使用布尔运算符
ret = f'Done! {deleted} entr{deleted != 1 and "ies were" or "y was"} removed.'
这些确实是我现在能想到的唯一有意义的其他方式,也是我想要这样做的原因是因为我有多个地方需要使单词复数。问题是,我可能想在某些地方使用不同的措辞,并且不想重复自己,将单词复数用于人类可读的格式。
解决方案
虽然我发现@sophros 的回答知识渊博且内容丰富,但我认为这超出了我的需要。我决定编写自己的自定义类,因为我需要一些便宜又简单的东西,并且我可以重复使用不同的单词/句子。如果您喜欢,请随意使用自己!
class Plural:
__slots__ = 'word', 'value', 'singular', 'plural', 'zero', 'ignore_negatives'
def __init__(self, value: int, word: str = "", **kwargs):
"""
Parameters
----------
value : int
The determining value
word : str, optional
The word to make plural. (defaults to "")
singular : str, optional
Appended to `word` if `value` == 1. (defaults to '')
plural : str, optional
Appended to `word` if `value` > 1. (defaults to 's')
zero : str, optional
Replaces `value` if `value` == 0. (defaults to 0)
ignore_negatives : bool, optional
This will raise ValueError if `value` is negative. (defaults to False)
Set to True if you don't care about negative values.
"""
self.value, self.word = value, word
self.singular = kwargs.pop('singular', '')
self.plural = kwargs.pop('plural', 's')
self.zero = kwargs.pop('zero', 0)
self.ignore_negatives = kwargs.pop('ignore_negatives', False)
def __str__(self):
v = self.value
pluralizer = self.plural if abs(v) > 1 else self.singular
if v < 0 and not self.ignore_negatives:
raise ValueError
return f"{v or self.zero} {self.word}{pluralizer}"
测试它是否有效
print(Plural(-2, singular="entry", plural="entries", ignore_negatives = True))
#-2 entries
print(Plural(-1, singular="entry", plural="entries", ignore_negatives = True))
#-1 entry
print(Plural(0, singular="entry", plural="entries"))
#0 entries
print(Plural(1, singular="entry", plural="entries"))
#1 entry
print(Plural(2, singular="entry", plural="entries"))
#2 entries
负值
print(Plural(-1, singular="entry", plural="entries"))
#Traceback (most recent call last):
#File "/home/main.py", line 53, in <module>
# print(Plural(-1, singular="entry", plural="entries"))
# File "/home/main.py", line 43, in __str__
# raise ValueError
#ValueError
其他用例
print(Plural(1, "entr", singular="y", plural="ies"))
#1 entry
print(Plural(2, "entr", singular="y", plural="ies"))
#2 entries
print(Plural(0, "value", zero="No"))
#No value
print(Plural(1, "value"))
#1 Value
print(Plural(2, "value"))
#2 Values
如果你只是想要一个快速而肮脏的修复
要么在问题中使用我的一个示例,要么在我的问题中使用类似的方法,但这是一个调整后的版本,如@Ev。Kounis和@9769953在评论中建议(希望你不介意我把你的建议放在答案中)
def plural(num: int, word: str = "", single: str = "", mult: str = 's'):
return f"{num} {(plural, singular)[abs(num) == 1]}"
推荐阅读
- java - 从 Uri 压缩图像
- video - amp-story 中 amp-video 的高级布局技术在哪里?
- javascript - 在 Angular 6 component.html 中使用脚本标签
- angular - 反应形式角度添加新控件
- amazon-web-services - 如何将脚本参数传递给 AWS Batch 获取并运行
- signals - 信号的阻尼正弦形式 FFT
- datastep - 在 SAS 数据步骤中按日期时间分组
- javascript - JS从上传中获取多个文件
- c# - 如何有效地转换 IList
到字节[]? - maven - Maven:如何测试目标文件夹中生成的文档是否正确生成?