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

后端 未结 10 779
小鲜肉
小鲜肉 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:19

    You are probably looking for iteritems():

    d = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
    address = "123 north anywhere street"
    
    for k,v in d.iteritems():
        address = address.upper().replace(k, v)
    

    address is now '123 N ANYWHERE STREET'


    Well, if you want to preserve case, whitespace and nested words (e.g. Southstreet should not converted to Sstreet), consider using this simple list comprehension:

    import re
    
    l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
    
    address = "North 123 East Anywhere Southstreet    West"
    
    new_address = ''.join(l[p.upper()] if p.upper() in l else p for p in re.split(r'(\W+)', address))
    

    new_address is now

    N 123 E Anywhere Southstreet    W
    
    0 讨论(0)
  • 2020-12-03 01:23

    you are close, actually:

    dictionary = {"NORTH":"N", "SOUTH":"S" } 
    for key in dictionary.iterkeys():
        address.upper().replace(key, dictionary[key])
    

    Note: for Python 3 users, you should use .keys() instead of .iterkeys():

    dictionary = {"NORTH":"N", "SOUTH":"S" } 
    for key in dictionary.keys():
        address.upper().replace(key, dictionary[key])
    
    0 讨论(0)
  • 2020-12-03 01:25

    One option I don't think anyone has yet suggested is to build a regular expression containing all of the keys and then simply do one replace on the string:

    >>> import re
    >>> l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
    >>> pattern = '|'.join(sorted(re.escape(k) for k in l))
    >>> address = "123 north anywhere street"
    >>> re.sub(pattern, lambda m: l.get(m.group(0).upper()), address, flags=re.IGNORECASE)
    '123 N anywhere street'
    >>> 
    

    This has the advantage that the regular expression can ignore the case of the input string without modifying it.

    If you want to operate only on complete words then you can do that too with a simple modification of the pattern:

    >>> pattern = r'\b({})\b'.format('|'.join(sorted(re.escape(k) for k in l)))
    >>> address2 = "123 north anywhere southstreet"
    >>> re.sub(pattern, lambda m: l.get(m.group(0).upper()), address2, flags=re.IGNORECASE)
    '123 N anywhere southstreet'
    
    0 讨论(0)
  • 2020-12-03 01:26

    Try,

    import re
    l = {'NORTH':'N','SOUTH':'S','EAST':'E','WEST':'W'}
    
    address = "123 north anywhere street"
    
    for k, v in l.iteritems():
        t = re.compile(re.escape(k), re.IGNORECASE)
        address = t.sub(v, address)
    print(address)
    
    0 讨论(0)
提交回复
热议问题