【问题标题】:pythonic way to manipulate nested dict from dotted path?从虚线路径操作嵌套字典的pythonic方法?
【发布时间】:2018-08-31 19:01:58
【问题描述】:

我有一个嵌套字典、一个加密函数和一个虚线路径,我想应用我的加密函数来加密特定字段。 示例:

我的字典

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

字段路径:a.b.c

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

【问题讨论】:

  • 你的意思是整个字典都是作为字符串给你的,它包括一个“虚线路径”?什么是虚线路径?
  • 是的,我有一个字典和一个虚线路径,“虚线路径”是指如果提供了“abc”,则加密 d['a']['b']['c'], if 'xyzk' 改为加密 d['x']['y']['z']['k'] 等等
  • 你可能想编辑问题并澄清,否则它可能会被否决
  • 好吧,这可能会有所帮助github.com/fabiocaccamo/python-benedict

标签: python dictionary nested


【解决方案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}}}

【讨论】:

    【解决方案2】:

    我猜你的意思是让嵌套的数量根据'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 修改为

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

    【讨论】:

      【解决方案3】:

      字典在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])
      

      【讨论】:

      • 如何自动制作?无论虚线路径是什么?
      • 虚线路径是什么意思?
      • 如果提供 'abc' 加密 d['a']['b']['c'],如果 'xyzk' 则加密 d['x']['y'][ 'z']['k'] 等等
      • 啊,我明白了。好吧,您需要以某种方式区分键。所以这取决于你的任务。例如,如果您知道每个嵌套字典中有一个键,则可以轻松访问它。你的嵌套字典是这样的吗?
      • 是的,我想像你说的那样访问,但是非常动态
      【解决方案4】:

      也许有点太晚了,棘手,但要实用

      from functools import reduce
      
      d = {'a': {'b': {'c': 'value'}}}
      path = 'a.b.c'
      
      # result will be 'value'
      result = reduce(dict.__getitem__, path.split('.'), d)
      

      【讨论】:

        【解决方案5】:

        按照推荐的做法,您可能应该得到它,

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

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

        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)
        

        结果:

        True
        

        【讨论】:

          猜你喜欢
          • 2020-10-19
          • 1970-01-01
          • 2014-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多