如何根据另一个字典中指定相同键的值更改字典键?

时间:2017-06-01 17:55:10

标签: python python-2.7 list dictionary iteration

我正在尝试使用另一个字典中的键值对更新字典键。我想要组合的两个词典都嵌套在列表中:

dictionary1 = [{ '32639': {'78549': {'526' : { 'sum': 8930.40, 'min' : 2380, 'max': 74839}}}} , {'89304': {'20384': {'152' : { 'sum': 51235.20, 'min' : 4512, 'max': 362.69}}}}, { '41526': {'45315': {'364' : { 'sum': 8985.65, 'min' : 3632.32, 'max': 4558.15}}}}]

dictionary2 = [{'32639':'90283'}, {'49034': '89203'}, {'28942': '39024'}, {'41526':'24903'} ]

我希望生成的字典看起来与dictionary1完全一样,但是如果dictionary1中字典的键位于dictionary2的字典中,则应该更改它们。

结果字典:

new_dictionary = [{ '90283': {'78549': {'526' : { 'sum': 8930.40, 'min' : 2380, 'max': 74839}}}} , {'89304': {'20384': {'152' : { 'sum': 51235.20, 'min' : 4512, 'max': 362.69}}}}, { '24903': {'45315': {'364' : { 'sum': 8985.65, 'min' : 3632.32, 'max': 4558.15}}}}]

我试过了:

list1 = []
for d1, d2 in zip(dictionary1, dictionary2):
    for key, value in d1.iteritems():
        new_dict = {}
        if key in d2:
            new_dict[d2[key]] = value
            list1.append(new_dict)
        else:
            new_dict[key] = value
            list1.append(new_dict)

然而它不起作用,但是在这个样本数据上它可以工作,程序只根据dictionary2的长度迭代通过dictionary1。所以我试图用一个包含841个字典(字典1)和53个字典列表(字典2)的列表来运行它,它只会在字典1退出之前转换前面的53个键。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

ds1 = [{ '32639': {'78549': {'526' : { 'sum': 8930.40, 'min' : 2380, 'max': 74839}}}} , {'89304': {'20384': {'152' : { 'sum': 51235.20, 'min' : 4512, 'max': 362.69}}}}, { '41526': {'45315': {'364' : { 'sum': 8985.65, 'min' : 3632.32, 'max': 4558.15}}}}]

ds2 = [{'32639':'90283'}, {'49034': '89203'}, {'28942': '39024'}, {'41526':'24903'} ]

def trans(ds1, ds2):
    for d1 in ds1:
        for d2 in ds2:
            ckeys = d1.keys() & d2.keys()
            ukeys = d1.keys() - d2.keys()
            for ck in ckeys:
                yield (d2[ck], d1[ck])
            for uk in ukeys:
                yield (uk, d1[uk])
print(dict(trans(ds1, ds2)))

我得到了输出:

{'90283': {'78549': {'526': {'sum': 8930.4, 'min': 2380, 'max': 74839}}}, '32639': {'78549': {'526': {'sum': 8930.4, 'min': 2380, 'max': 74839}}}, '89304': {'20384': {'152': {'sum': 51235.2, 'min': 4512, 'max': 362.69}}}, '41526': {'45315': {'364': {'sum': 8985.65, 'min': 3632.32, 'max': 4558.15}}}, '24903': {'45315': {'364': {'sum': 8985.65, 'min': 3632.32, 'max': 4558.15}}}}