如何映射/分配/替换一个字典的值到另一个字典?

时间:2016-06-27 08:59:57

标签: python python-2.7 dictionary

说我有以下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。

我该怎么做?

3 个答案:

答案 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'}}

请注意,choice1d2中出现两次,choice2不存在。

答案 2 :(得分:0)

您需要迭代密钥然后使用它来提取数据。例如:

要从d2中提取名称:

for name in d2:
    print name
  

<强>输出
   约翰

为每个名称提取字典:

for name  in d2:
    for choice in d2[name]:
        print choice
  

<强>输出
   敏捷性   强度