Учитывая словарь 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)
где круглые скобки возвращают содержимое, если значение множественное, или если содержимое имеет запятую, означает множественное число/исключительное