0

我正在尝试将键与唯一标识符相关联。也就是将 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
4

1 回答 1

1

你缺少几个部分。首先,当您递归调用函数时,您需要将您已经确定的任何转换(例如A = 1)传递给您的函数——否则您不会对嵌套字典中的相同键使用相同的替换。此外,您需要一些方法来确保当您生成新密钥时,该密钥已用完并且不会再次使用。当您count在函数中增加时,这只会在对函数的当前调用中影响它 - 链上更高的任何调用都将继续使用 lower 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),这种转换并不完全符合您的要求,但它非常接近。

于 2013-06-24T19:42:26.943 回答