Skip to main content
 首页 » 编程设计

python之如何递归替换也是键的字典中的值,直到值中没有键为止

2025年05月04日9lyhabc

我有一个像这样的 dict:

d = {'a':'b+c', 'b':'f+g', 'f':'y+u'} 

我想递归地替换也是键的值中的字母,所以我最终得到:

d = {'a':'y+u+g+c', 'b':'y+u+g', 'f':'y+u'} 

我试过使用这段代码:

def getval(key,d): 
    if d.has_key(key): 
    temp=re.findall('\w+',d[key]) 
    for i in range(len(temp)): 
        if d.has_key(temp[i]): 
            getval(temp[i],d) 
        else: 
            continue 
 
for k,v in d.iteritems(): 
    temp=re.findall('\w+',d[k]) 
    for i in range(len(temp)): 
        if d.has_key(temp[i]): 
            getval(temp[i],d) 

但它不起作用。我该怎么做?我的真实字典要大得多,但绝对不包含任何循环。

请您参考如下方法:

我实际上不确定递归是否是这里最合适的方法,这是一个在循环中进行替换直到没有替换更改当前值的解决方案:

import re 
 
def make_replacements(d): 
    r = d.copy() 
    regex = dict((k, re.compile(r'\b' + re.escape(k) + r'\b')) for k in r) 
    for k in r: 
        done = False 
        while not done: 
            done = True 
            for k2 in r: 
                n = regex[k2].sub(r[k2], r[k]) 
                if n != r[k]: 
                    r[k] = n 
                    done = False 
    return r 
 
print make_replacements({'a': 'b+c', 'b': 'f+g', 'f': 'y+u'}) 
# {'a': 'y+u+g+c', 'b': 'y+u+g', 'f': 'y+u'} 

请注意,这不会检测输入中的任何循环,因此如果您给它类似 {'a':'b+c','b':'c+a','c' :'a+b'} 它将进入一个无限循环(尽管从您的评论中听起来这永远不应该发生)。