将Python Dict键映射到另一个Dict

时间:2018-01-03 16:34:09

标签: python dictionary

由于计划不周,我有一个脚本需要一个带有某些键的python dict但是,创建这个dict的另一个脚本使用不同的命名约定。

不幸的是,由于翻译已经发生,看起来我需要转换dict键。

基本上来自

 {'oldKey':'data'}

 {'newKey':'data'}

我在想创造一个词典:

 {'oldKey':'newKey'}

并遍历dict以从oldKey转换为newKey但是这是最有效/ pythonic方式吗?

2 个答案:

答案 0 :(得分:0)

我可以想到使用词典的几种方法,但其中一种方法可能更有效,具体取决于密钥用法的覆盖范围。

a)使用词典理解:

old_dict = {'oldkey1': 'val1', 'oldkey2': 'val2',
            'oldkey3': 'val3', 'oldkey4': 'val4',
            'oldkey5': 'val5'}

key_map = {'oldkey1': 'newkey1', 'oldkey2': 'newkey2',
           'oldkey3': 'newkey3', 'oldkey4': 'newkey4',
           'oldkey5': 'newkey5'}

new_dict = {newkey: old_dict[oldkey] for (oldkey, newkey) in key_map.iteritems()}

print new_dict['newkey1']

b)使用一个简单的类进行映射。 (请注意,在此示例中,我已在key_map中切换了键/值的顺序。)这可能更有效,因为它将使用延迟评估 - 无需遍历所有键 - 如果不是,则可以节省时间所有的钥匙都被使用了。

class DictMap(object):

    def __init__(self, key_map, old_dict):
        self.key_map = key_map
        self.old_dict = old_dict

    def __getitem__(self, key):
        return self.old_dict[self.key_map[key]]

key_map = {'newkey1': 'oldkey1',
           'newkey2': 'oldkey2',
           'newkey3': 'oldkey3',
           'newkey4': 'oldkey4',
           'newkey5': 'oldkey5'}

new_dict2 = DictMap(key_map, old_dict)

print new_dict2['newkey1']

答案 1 :(得分:0)

这将解决您的问题:

new_dict={key_map[oldkey]: vals for (oldkey, vals) in old_dict.items()}