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

标签 python recursion dictionary

我有一个像这样的 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/

相关文章:

haskell - 使用 Haskell 进行树遍历

javascript - 这种类型的递归叫什么?如何在 JavaScript (Node.js) 中实现它?

python - 是否可以在不改变位置的情况下重命名字典中的键?

.net - 为什么没有Dictionary.TrimExcess()?

python - 使用 python 将字节插入 Postgres 会出错,但是使用 PG SQL 控制台可以

python - Python 中的 BrokenPipeError 但 Perl 中没有

python - 在 PySparkense_rank() 中将 null 值保留为 null

java - 编写一个递归方法,返回 'A' 在传递的字符串中出现的次数

python:读取文件并将其拆分为字典列表

python - Django TypeError ("' %s' 是此函数的无效关键字参数")