说我有以下3个词典:
General case:
d1 = {'c_choice1': '1.10', 'c_choice2': '1.20',...}
d2 = {'John': {'strength': 'choice1', 'agility': 'choice2',...},...}
d3 = {'John': {'choice1': 'c_choice1', 'choice2': 'c_choice2',...},...}
d2 and d3 can be:
d2 = {'John': {'strength': 'choice1', 'agility': 'choice2'}, 'Kevin': {'int': 'choice1'}}
d3 = {'John': {'choice1': 'c_choice1', 'choice2': 'c_choice2'}, 'Kevin': {'choice1': 'c_choice1'}}
or
d2 = {'John': {'strength': 'choice1', 'agility': 'choice1'}}
d3 = {'John': {'choice1': 'c_choice1'}}
我想做什么(以一般情况为例):
a)从d3开始,让choice1 = c_choice1,choice2 = c_choice2等。
choice1 = c_choice1
choice2 = c_choice2
b)查找d1并找到c_choice1,c_choice2等的值。
c_choice1 = 1.10
c_choice2 = 1.20
c)创建一个最终字典,其中d1中的choice1,choice2等替换为d1中的值
我想要的输出(以一般情况为例):
d4 = {'John': {'strength': '1.10', 'agility': '1.20',...}...}
注意:
a)从输入文件中提取数据时会创建3个词典,键和值不是由我自己定义的,因此我不知道词典中键和值的顺序。
b)我正在使用Python 2.7。
我该怎么做?
答案 0 :(得分:2)
你可以将它作为单个嵌套字典理解来实现:
d4 = {name: {stat: d1[d3[name][choice]]
for name, choices in d2.items()
for stat, choice in stats.items()}
for name, stats in d2.items()}
但这几乎是不可能理解的。相反,循环和字典组合效果很好:
d4 = {}
for name, stats in d2.items():
d4[name] = {stat: d1[d3[name][choice]] for name, choices in d2.items()
for stat, choice in stats.items()}
答案 1 :(得分:2)
更新版本:根据评论中提供的信息,我修改了我的解决方案,以便在d2
中处理同一选择值或缺少实例的多个实例。这是新的解决方案,我相信它会做出所要求的。我修改了示例数据以实现新功能:
d1 = {'c_choice1': '1.10', 'c_choice2': '1.20'}
d2 = {'John': {'strength': 'choice1', 'agility': 'choice1'}}
d3 = {'John': {'choice1': 'c_choice1', 'choice2': 'c_choice2'}}
d4 = {}
for k in d3:
d2x = d2[k]
d3x = d3[k]
d2y = {v: [] for x in (d2x.values(), d3x.keys()) for v in x}
for k2 in d2x:
d2y[d2x[k2]].append(k2)
d4x = {v2 : d1[d3x[k3]] for k3 in d3x for v2 in d2y[k3]}
d4[k] = d4x
以下是d4
的样子:
{'John': {'agility': '1.10', 'strength': '1.10'}}
请注意,choice1
在d2
中出现两次,choice2
不存在。
答案 2 :(得分:0)
您需要迭代密钥然后使用它来提取数据。例如:
要从d2中提取名称:
for name in d2:
print name
<强>输出强>:
约翰
为每个名称提取字典:
for name in d2:
for choice in d2[name]:
print choice
<强>输出强>:
敏捷性 强度