복붙노트

[PYTHON] 다중 문자열 서식 지정

PYTHON

다중 문자열 서식 지정

정수 사전을 감안할 때 각 숫자로 문자열을 형식화하려고 시도하고 해당 항목을 복수화하려고합니다.

샘플 입력 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 (복수형 인 경우 문자열 ''이 아닌 경우)를 저장하는 것입니다. 다른 복수화 방법에 서브 클래 싱 됨

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

그러한 의심 할 여지없이 공통적 인 필요성 때문에, 나는 그런 복잡한 해결책으로 수건을 던지는 것을 주저합니다.

기본 제공 형식 메서드를 사용하여 이와 같이 문자열을 형식화하는 방법이 있습니까? 최소한의 추가 코드가 필요합니까? 가짜 코드는 다음과 같을 수 있습니다.

"{tree} tree{tree(s)}, {bush} bush{bush(es)}, {flower} flower{flower(s)}, {cactus} cact{cactus(i,us)}".format(data)

여기서 괄호는 값이 복수 인 경우 내용을 반환하고 내용이 쉼표 인 경우 복수 / 단수를 의미합니다

해결법

  1. ==============================

    1.사용자 정의 포매터 사용 :

    사용자 정의 포매터 사용 :

    import string
    
    class PluralFormattter(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 = PluralFormattter()
    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이 추가됨)을 사용하는 경우 사용자 정의 사전을 사용하는 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))
    

    출력 : 위와 같습니다.

  2. ==============================

    2.inflect 패키지를 확인하십시오. 그것은 다른 언어 적 속임수의 모든 호스트뿐만 아니라 물건을 복수화 할 것입니다. 이 특별한 경우에는 너무 많은 상황이 있습니다!

    inflect 패키지를 확인하십시오. 그것은 다른 언어 적 속임수의 모든 호스트뿐만 아니라 물건을 복수화 할 것입니다. 이 특별한 경우에는 너무 많은 상황이 있습니다!

    위의 링크에있는 문서에서 :

    import inflect
    p = inflect.engine()
    
    # UNCONDITIONALLY FORM THE PLURAL
    print("The plural of ", word, " is ", p.plural(word))
    
    # CONDITIONALLY FORM THE PLURAL
    print("I saw", cat_count, p.plural("cat",cat_count))
    

    구체적인 예 :

    {print(str(count) + " " + p.pluralize(string, count)) for string, count in data.items() }
    
  3. ==============================

    3.나는 같이 갈거야.

    나는 같이 갈거야.

    class Pluralizer:
        def __init__(self, value):
            self.value = value
    
        def __format__(self, formatter):
            formatter = formatter.replace("N", str(self.value))
            start, _, suffixes = formatter.partition("/")
            singular, _, plural = suffixes.rpartition("/")
    
            return "{}{}".format(start, singular if self.value == 1 else plural)
    
    "There are {:N thing/s} which are made of {:/a cactus/N cacti}".format(Pluralizer(10), Pluralizer(1))
    #>>> 'There are 10 things which are made of a cactus'
    

    형식은 항상 / 단일 / 복수이며 단수 (복수) 선택적입니다.

    그래서

    "xyz/foo/bar".format(Pluralizer(1)) == "xyzfoo"
    "xyz/foo/bar".format(Pluralizer(2)) == "xyzbar"
    
    "xyz/bar".format(Pluralizer(1)) == "xyz"
    "xyz/bar".format(Pluralizer(2)) == "xyzbar"
    
    "xyz".format(Pluralizer(1)) == "xyz"
    "xyz".format(Pluralizer(2)) == "xyz"
    

    그렇다면 귀하의 예를 들어 그냥 하나 :

    data = {'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0}
    string = 'My garden has {tree:N tree/s}, {bush:N bush/es}, {flower:N flower/s}, and {cactus:N cact/us/i}'
    
    string.format_map({k: Pluralizer(v) for k, v in data.items()})
    #>>> 'My garden has 1 tree, 2 bushes, 3 flowers, and 0 cacti'
    
  4. ==============================

    4.Django를 이미 사용했다면, 그것은 쉽습니다 : 복수 화는 그 함수입니다.

    Django를 이미 사용했다면, 그것은 쉽습니다 : 복수 화는 그 함수입니다.

    템플릿에서 자주 사용됩니다.

    You have {{ num_messages }} message{{ num_messages|pluralize }}.
    

    그러나 파이썬 코드에서도 사용할 수 있습니다.

    f'You have {num_messages} message{pluralize(num_messages)}.'
    

    파이썬 2에서는 다음과 같이 읽힐 것이다.

    'You have {} message{}.'.format(num_messages, pluralize(num_messages))
    

    또는:

    'You have %d message%s' % (num_messages, pluralize(num_messages))
    

    장고 복수형 워드 프로세서 : https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#pluralize

  5. from https://stackoverflow.com/questions/21872366/plural-string-formatting by cc-by-sa and MIT license