在嵌套字典中将字符串键与int相关联

时间:2013-06-24 19:07:19

标签: python

我正在尝试将密钥与唯一标识符相关联。也就是说,将dict1转换为dict2:

dict1={'A': {'A': 1},
       'B': {'B': .5, 'C': .36, 'E': .14},
       'C': {'A': .5, 'C': .5},
       'D': {'G': 1},
       'E': {'F': 1},
       'F': {}
       }

dict2={1: {1: 1},
       2: {2: .5, 3: .36, 5: .14},
       3: {1: .5, 3: .5},
       4: {7: 1},
       5: {6: 1},
       6: {}
       }

我提出了一些递归的东西,但我的代码对于嵌套密钥效果不佳。有关如何修复代码或解决此问题的任何建议?

def transform(d, count = 1):
    output={}
    for k,v in d.iteritems():
        k=count
        count = count + 1
        if isinstance(v,dict):
            v=transform(v, count)
        output[k]=v
    return output

1 个答案:

答案 0 :(得分:1)

您缺少一些部分。首先,当您以递归方式调用时,您需要将已经确定的任何转换(例如A = 1)传递给您的函数 - 否则您将不会对嵌套字典中的相同键使用相同的替换。此外,您需要某种方法来确保在生成新密钥时,该密钥已用完并且不会再次使用。当您在函数中增加count时,这只会影响当前对该函数的调用 - 链中较高的任何调用将继续使用较低的count,因此密钥将被多次使用

我的尝试:

import itertools

def transform(d, key_generator=None, conversion=None):
    if key_generator is None:
        key_generator = itertools.count(start=1)
    if conversion is None:
        conversion = {}
    output = {}
    for k, v in d.iteritems():
        if k in conversion:
            k = conversion[k]
        else:
            next_key = next(key_generator)
            conversion[k] = next_key
            k = next_key
        if isinstance(v, dict):
            v = transform(v, key_generator, conversion)
        output[k] = v
    return output

测试:

conversion = {}
transform(dict1, conversion=conversion)
print conversion

{1: {1: 1},
 2: {1: 0.5, 2: 0.5},
 3: {2: 0.36, 3: 0.5, 4: 0.14},
 4: {5: 1},
 5: {},
 6: {7: 1}}
{'A': 1, 'C': 2, 'B': 3, 'E': 4, 'D': 6, 'G': 7, 'F': 5}

由于字典的迭代顺序未确定(因为即使您对初始字典进行排序,E将在D之前处理),此转换也不是您所寻找的,但它非常接近。