我有一个像这样的 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'}
它将进入一个无限循环(尽管从您的评论中听起来这永远不应该发生)。
关于python - 如何递归替换也是键的字典中的值,直到值中没有键为止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168944/