Python 字典循环获取每个值

Python 字典循环获取每个值,python,dictionary,traversal,Python,Dictionary,Traversal,没有任何进口 # given deps = {'W': ['R', 'S'], 'C': [], 'S': ['C'], 'R': ['C'], 'F': ['W']} prob = {'C': [0.5], 'R': [0.2, 0.8], 'S': [0.5, 0.1], 'W': [0.01, 0.9, 0.9, 0.99], 'F' : [0.4, 0.3]} k = 'F' # want to return: L = [[0.2, 0.8], [0.5, 0.1], [0.0

没有任何进口

# given
deps = {'W': ['R', 'S'], 'C': [], 'S': ['C'], 'R': ['C'], 'F': ['W']}
prob = {'C': [0.5], 'R': [0.2, 0.8], 'S': [0.5, 0.1], 'W': [0.01, 0.9, 0.9,     0.99], 'F' : [0.4, 0.3]}
k = 'F'
# want to return:  L = [[0.2, 0.8], [0.5, 0.1], [0.01, 0.9, 0.9, 0.99], [0.4, 0.3]]


# attempt

L = []

for i in deps[k]:
    s = i
    while(deps[s] != []):
        L.append(prob[s])
        s = deps[s]
print(L)
我很难弄明白这一点。给定两个字典:依赖项和概率,我希望遍历一个选择点并设置每个值,所以在上面的例子中,我选择了“F”

它将首先进入'F'的dep,找到'W',然后检查它的dep,['R','S',],然后检查'R',看到'R'的依赖项是'C','C'不是依赖项,所以我们停在'R'并将其概率附加到L中

 [[0.2, 0.8]]
然后我们进入S,做同样的事情

[[0.2, 0.8], [0.5, 0.1]]
然后我们就结束了,我们回到了W

[[0.2, 0.8], [0.5, 0.1], [0.01, 0.9, 0.9, 0.99]]
最后,既然我们完成了W,我们得到了F的问题

[[0.2, 0.8], [0.5, 0.1], [0.01, 0.9, 0.9, 0.99], [0.4, 0.3]]

当存在多个依赖值时,我的代码将失败。我不知道该怎么解决这个问题。在给定deps和prob以及k的值时,我尝试创建一个函数来实现这一点,我将使用一个
while
循环来解决这个问题,该循环不断地查看您是否使用了递归找到的所有值。您可以使用如下结构:

deps = {'W': ['R', 'S'], 'C': [], 'S': ['C'], 'R': ['C'], 'F': ['W']}
# out = ['F', 'W', 'R', 'S']
prob = {'C': [0.5], 'R': [0.2, 0.8], 'S': [0.5, 0.1], 'W': [0.01, 0.9, 0.9, 0.99], 'F': [0.4, 0.3]}
k = 'F'

L = []
my_list = []
found_all = False

def get_values(dep_dictionary, prob_dict, start_key):
    used_keys = []
    keys_to_use = [start_key]
    probability = []
    # build a list of linked values from deps dictionary
    while used_keys != keys_to_use:
        print('used: {}'.format(used_keys))
        print('to use: {}'.format(keys_to_use))
        for i in range(len(keys_to_use)):
            if keys_to_use[i] not in used_keys:
                new_keys = dep_dictionary[keys_to_use[i]]
                if len(new_keys):
                    for sub_key in new_keys:
                        if sub_key not in keys_to_use:
                            keys_to_use.append(sub_key)
                    used_keys.append(keys_to_use[i])
                else:
                    del keys_to_use[i]
    # at this point used_keys = ['F', 'W', 'R', 'S']
    for key in used_keys:
        probability.append(prob_dict[key])
    print(probability)

get_values(deps, prob, k)
哪些产出:

used: []
to use: ['F']
used: ['F']
to use: ['F', 'W']
used: ['F', 'W']
to use: ['F', 'W', 'R', 'S']
used: ['F', 'W', 'R', 'S']
to use: ['F', 'W', 'R', 'S', 'C']
[[0.4, 0.3], [0.01, 0.9, 0.9, 0.99], [0.2, 0.8], [0.5, 0.1]]
您可以看到输出是正确的(
[[0.4,0.3],[0.01,0.9,0.9,0.99],[0.2,0.8],[0.5,0.1]]
),但顺序并不完全相同,但听起来这不是一个大问题。如果是,您始终可以通过调整

for key in used_keys:
    probability.append(prob_dict[key])

位,使得
概率
也是一个字典。您还可以取出
print()
语句,它们只是用来调试并直观地显示循环中发生的事情。您也可能会使用函数
返回概率
,而不是打印它,但我会让您自行决定

这里有一个解决方案,它使用基于堆栈的深度优先搜索遍历依赖关系树。它在每一步增加概率。该节点具有依赖项,然后在末尾简单地反转列表

def prob_list(root):
    nodes_to_visit = [root]
    prob_list = []

    while nodes_to_visit:
        curr = nodes_to_visit.pop()
        print(f"Visiting {curr}")

        if deps[curr]:
            prob_list.append(prob[curr])
            for dep in deps[curr]:
                nodes_to_visit.append(dep)

    return list(reversed(prob_list))

print(prob_list("F"))  # [[0.2, 0.8], [0.5, 0.1], [0.01, 0.9, 0.9, 0.99], [0.4, 0.3]]