Форматирование строк во множественном числеPython

Программы на Python
Ответить
Anonymous
 Форматирование строк во множественном числе

Сообщение Anonymous »

Имея словарь целых чисел, я пытаюсь отформатировать строку с каждым числом и множественным числом этого элемента.

Пример ввода dict:

Код: Выделить всё

data = {'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0}
Пример выходной строки:

Код: Выделить всё

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»