如何通过在python中的分隔符上拆分键从dict创建嵌套的dict?

时间:2014-07-22 13:12:42

标签: python recursion dictionary

我有一个类似下面的词典:

a = { 
  'customer_name': 'bob', 
  'customer_phone': '555-1212', 
  'order_0_number': 'A33432-24',
  'order_0_date': '12/12/12',
  'order_1_number': 'asd24222',
  'order_1_date': '12/14/12'
}

我需要将它拆分为下划线并放入这样的嵌套字典中:

b = {
  'customer': {
    'name': 'bob',
    'phone': '555-1212'
  },
  'order': {
    '0': {
      'date': '12/12/12',
      'number': '...' },
    '1': { ... etc.

我拥有的实际数据比这更嵌套。 我对此非常感兴趣,但在Python中如何做到这一点:

def expand_data(field, value):

  split_field = field.split('_', 1)

  #base case, end of string
  if len(split_field) == 1:
    child_element[split_field[0] = value
    return child_element
  else:
    child_element[split_field[0]] = expand_data(split_field[1],value)
    return child_element

b = {}
for k,v in a.iteritems():
  b += expand_data(k, v) # stuck here because I can't add nested dicts together

但我并不完全确定这是正确的方法。我还没有运行这段代码,只是想现在就考虑一下。

此外,dict键可能在将来发生变化,因此我可以依赖的是' _'强调在那里分裂。我也不知道它需要有多深的嵌套。

3 个答案:

答案 0 :(得分:1)

通用解决方案:

def nest_dict(flat_dict, sep='_'):
    """Return nested dict by splitting the keys on a delimiter.

    >>> from pprint import pprint
    >>> pprint(nest_dict({'title': 'foo', 'author_name': 'stretch',
    ... 'author_zipcode': '06901'}))
    {'author': {'name': 'stretch', 'zipcode': '06901'}, 'title': 'foo'}
    """
    tree = {}
    for key, val in flat_dict.items():
        t = tree
        prev = None
        for part in key.split(sep):
            if prev is not None:
                t = t.setdefault(prev, {})
            prev = part
        else:
            t.setdefault(prev, val)
    return tree


if __name__ == '__main__':
    import doctest
    doctest.testmod()

答案 1 :(得分:0)

以下是您可以使用的步骤,但由于您没有向我们展示您的任何代码,因此我无法提供代码。

  1. 通过您的密钥处理,您可以使用for key in yourDico
  2. 轻松完成
  3. 然后检测您的模式customerorder以拆分值以获得您想要的内容。
  4. 考虑你从第一次拆分中得到的东西用新数据创建dico并重复拆分,如果它仍然包含_,这似乎是你的拆分字符。

答案 2 :(得分:0)

b = {}
b["customer"] = {"name": a["customer_name"], "phone": a["customer_phone"]}
for key in a.keys():
    if key.startswith("order_"):
        o, i, f = key.split("_")
        order = b.get("order", {})
        order_i = order.get(i, {})
        order_i[f] = a[key]
        b["order"] = order
        b["order"][i] = order_i

print(b)

输出:

{'customer': {'name': 'bob', 'phone': '555-1212'},
 'order': {'0': {'date': '12/12/12', 'number': 'A33432-24'},
           '1': {'date': '12/14/12', 'number': 'asd24222'}}}