从虚线路径操纵嵌套字典的pythonic方法?

时间:2018-03-22 11:03:05

标签: python dictionary nested

我有嵌套字典,加密功能和虚线路径,我想应用我的加密功能来加密特定字段。 例如:

mydict

{"a":{
     ...
     "b":{
          ...
          "c":"value"
           }
      }
 }

字段路径:' a.b.c'

我想对c值执行加密功能并修改我的字典。 什么是最有效和pythonic的方式?

5 个答案:

答案 0 :(得分:1)

字典在python中非常有效,所以你可以直接加密它:

# d -- dictionary
key1 = d.keys()[0]
key2 = d[key1].keys()[0]
key3 = d[key1][key2].keys()[0]
d[key1][key2][key3] = encrypt(d[key1][key2][key3])

答案 1 :(得分:1)

我猜你的意思是嵌套的数量可以根据像$vm.LicenseType = "Windows_Server"这样的字符串变化:

'a.b.c'

这会将给定的字典d = {"a":{"b":{"c":"value"}}} dotted = 'a.b.c' paths, current = dotted.split('.'), d for p in paths[:-1]: current = current[p] current[paths[-1]] = encrypt(current[paths[-1]]) 修改为

d

答案 2 :(得分:1)

使用以下功能

def update(d, path, value):
    out = path.split('.', 1)
    key = out[0]
    if len(out) > 1:
        path = out[1]
        return update(d[key], path, value)
    else:
        d[key] = value
d = {'a': {'b': {'c': 'value'}}}
path = 'a.b.c'
value = 100 # let's consider encrypted value
update(d, path, value)
print(d )
# Output: {'a': {'b': {'c': 100}}}

答案 3 :(得分:1)

也许为时已晚,棘手,但要起作用

SELECT userid, max(timestamp) timestamp
FROM users 
WHERE userid IN (22,15,42) 
GROUP BY userid 

答案 4 :(得分:0)

通过推荐的做法,您应该可以通过

获得
{"a":{"b":{"c":"whatever the encrypted value is"}}}

或者你可以添加一个类来对象使用点(虽然是一个hacky解决方案)。

d['a']['b']['c']

结果:

class Objectify(object):
    def __init__(self, obj):
        for key in obj:
            if isinstance(obj[key], dict):
                self.__dict__.update(key=Objectify(obj[key]))
            else:
                self.__dict__.update(key=obj[key])

d = Objectify({'a': {'b': {'c': True}}})
print(d.a.b.c)