Given a dictionary of ints, I'm trying to format a string with each number, and a pluralization of the item.
Sample input dict:
data = {'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0} Sample output str:
'My garden has 1 tree, 2 bushes, 3 flowers, and 0 cacti' It needs to work with an arbitrary format string.
The best solution I've come up with is a PluralItem class to store two attributes, n (the original value), and s (the string 's' if plural, empty string '' if not). Subclassed for different pluralization methods
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' Then make a new dict through comprehension and a classes mapping:
classes = {'bush': PluralES, 'cactus': PluralI, None: PluralItem} plural_data = {key: classes.get(key, classes[None])(value) for key, value in data.items()} Lastly, the format string, and implementation:
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)) Outputs the following:
My garden has 1 tree, 2 bushes, 3 flowers, and 0 cacti For such an undoubtedly common need, I'm hesitant to throw in the towel with such a convoluted solution.
Is there a way to format a string like this using the built-in format method, and minimal additional code? Pseudocode might be something like:
"{tree} tree{tree(s)}, {bush} bush{bush(es)}, {flower} flower{flower(s)}, {cactus} cact{cactus(i,us)}".format(data) where parentheses return the contents if value is plural, or if contents has comma, means plural/singular