python - 字典循环获取每个值
问题描述
没有任何进口
# 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)
我很难弄清楚这一点。因此,给定 2 个字典:依赖项和概率我希望遍历一个选择点并设置每个值,因此对于上面的示例,我选择了“F”。
它会首先进入'F'的deps,找到'W'然后检查那个是['R','S']的deps然后检查'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])
有点这样,这probability
也是一本字典。您也可以取出print()
语句,它们只是用于调试并直观地显示循环中发生的事情。您也可能拥有该功能return probability
而不是打印它,但我会让您自行决定!
推荐阅读
- laravel - 更改 laravel html 语言变量
- python - 为什么检索到的数据显示为空白而不是输出正确的数字?
- node.js - node express 无法获取静态内容
- flutter - Flutter clean 命令导致空安全错误
- ios - Swift:将字符串转换为字符串中的单词和范围列表
- node.js - ERR_INVALID_ARG_TYPE 使用 webpack 运行criticalcss
- wordpress - Wordpress 网站重新加载显示 2 个标题
- go - Delve 中的 args 命令是否也显示返回值(而不仅仅是函数参数)?
- java - Intellij 不接受 openjdk 15
- ruby - 比较 2 个库的“大小”