can you write a str.replace() using dictionary values in Python?

后端 未结 10 776
小鲜肉
小鲜肉 2020-12-03 00:20

I have to replace the north, south, etc with N S in address fields.

If I have

list = {\'NORTH\':\'N\',\'SOUTH\':\'S\',\'EAST\':\'E\',\'WEST\':\'W\'}         


        
相关标签:
10条回答
  • 2020-12-03 01:01
    def replace_values_in_string(text, args_dict):
        for key in args_dict.keys():
            text = text.replace(key, str(args_dict[key]))
        return text
    
    0 讨论(0)
  • 2020-12-03 01:02
    address = "123 north anywhere street"
    
    for word, initial in {"NORTH":"N", "SOUTH":"S" }.items():
        address = address.replace(word.lower(), initial)
    print address
    

    nice and concise and readable too.

    0 讨论(0)
  • 2020-12-03 01:03

    All of these answers are good, but you are missing python string substitution - it's simple and quick, but requires your string to be formatted correctly.

    address = "123 %(direction)s anywhere street"
    print(address % {"direction": "N"})
    
    0 讨论(0)
  • 2020-12-03 01:07

    I would suggest to use a regular expression instead of a simple replace. With a replace you have the risk that subparts of words are replaced which is maybe not what you want.

    import json
    import re
    
    with open('filePath.txt') as f:
       data = f.read()
    
    with open('filePath.json') as f:
       glossar = json.load(f)
    
    for word, initial in glossar.items():
       data = re.sub(r'\b' + word + r'\b', initial, data)
    
    print(data)
    
    0 讨论(0)
  • 2020-12-03 01:16

    Both using replace() and format() are not so precise:

    data =  '{content} {address}'
    for k,v in {"{content}":"some {address}", "{address}":"New York" }.items():
        data = data.replace(k,v)
    # results: some New York New York
    
    '{ {content} {address}'.format(**{'content':'str1', 'address':'str2'})
    # results: ValueError: unexpected '{' in field name
    

    It is better to translate with re.sub() if you need precise place:

    import re
    def translate(text, kw, ignore_case=False):
        search_keys = map(lambda x:re.escape(x), kw.keys())
        if ignore_case:
            kw = {k.lower():kw[k] for k in kw}
            regex = re.compile('|'.join(search_keys), re.IGNORECASE)
            res = regex.sub( lambda m:kw[m.group().lower()], text)
        else:
            regex = re.compile('|'.join(search_keys))
            res = regex.sub( lambda m:kw[m.group()], text)
    
        return res
    
    #'score: 99.5% name:%(name)s' %{'name':'foo'}
    res = translate( 'score: 99.5% name:{name}', {'{name}':'foo'})
    print(res)
    
    res = translate( 'score: 99.5% name:{NAME}', {'{name}':'foo'}, ignore_case=True)
    print(res)
    
    0 讨论(0)
  • 2020-12-03 01:17

    "Translating" a string with a dictionary is a very common requirement. I propose a function that you might want to keep in your toolkit:

    def translate(text, conversion_dict, before=None):
        """
        Translate words from a text using a conversion dictionary
    
        Arguments:
            text: the text to be translated
            conversion_dict: the conversion dictionary
            before: a function to transform the input
            (by default it will to a lowercase)
        """
        # if empty:
        if not text: return text
        # preliminary transformation:
        before = before or str.lower
        t = before(text)
        for key, value in conversion_dict.items():
            t = t.replace(key, value)
        return t
    

    Then you can write:

    >>> a = {'hello':'bonjour', 'world':'tout-le-monde'}
    >>> translate('hello world', a)
    'bonjour tout-le-monde'
    
    0 讨论(0)
提交回复
热议问题