2014-09-25 6 views
-3

Я не могу найти хороший алгоритм для выравнивания значений, указанных в dict. Мое выражение представляет собой строку с «переменными». Каждая переменная может быть числом или другой переменной т.е: Мой ДИКТ являетсяАлгоритм выражения сглаживания

map = { 
    'a': 4, 
    'b': 6, 
    'c': 'a+b', 
    'd': 'c+a+4' 
} 

и выражение может быть как это:

first = 'a + b' # result should be: '4 + 6'

secound = 'd PLUS c' # result '4+6+4+4 PLUS 4+6'

Я не хочу оценивать этот результат. Интересно, как заменить (расплющить?) Такие переменный, от действительных чисел (от карты Словаря)

ответ

2

Использования регулярной замены выражений (re.sub или RegexpObject.sub, которые принимают не только строки замены, но и замена функцию в качестве второго параметра):

import re 

def flatten(expression, mapping): 
    pattern = re.compile('|'.join(map(re.escape, mapping))) 
    while pattern.search(expression): 
     expression = pattern.sub(lambda m: mapping[m.group()], expression) 
    return expression 

mapping = { 
    'a': 4, 
    'b': 6, 
    'c': 'a+b', 
    'd': 'c+a+4' 
} 

# Convert all values to strings. 
mapping = {key: str(mapping[key]) for key in mapping} 

использование:

>>> flatten('a + b', mapping) 
'4 + 6' 
>>> flatten('d PLUS c', mapping) 
'4+6+4+4 PLUS 4+6' 

BTW, не используйте map в качестве имени переменной. Он будет теневой встроенной функцией map.

Смежные вопросы