3

Python で JSON を新しい構造に再編成する必要があります。

例えば:

{
  'a' : 1,
  'b' : 1,
  'd' : {'d1' : '1', 'd2' : 2},
  'm' : [
    {'x' : 6, 'y' : 5, 'z' : {'foo' : 'foo1', 'bar' : 'bar1'} },
    {'x' : 8, 'y' : 8, 'z' : {'foo' : 'foo2', 'bar' : 'bar2'} }
  ]
}

{
  'new_a' : 1,
  'new_d' : {'new_d1' : '1', 'new_d2' : 2},
  'new_m' : [
    {'new_x' : 6, 'new_z' : {'new_foo' : 'foo1', new_'bar : 'bar1'} },
    {'new_x' : 8, 'new_z' : {'new_foo' : 'foo2', 'new_bar : 'bar2'} }
  ]
}

古いJSONの新しい形のアイデアがあります

それを行うよりエレガントな方法はありますか?

import json

new_data = {}
new_data['new_a'] = old_data['a']
new_data['new_d'] = {}
new_data['new_d']['new_d1'] = old_data['d']['d1']
new_data['new_d']['new_d2'] = old_data['d']['d2']
new_data['new_m'] = {}
new_m = []
for m in old_data:
    new_m.append({'new_x' : m['x'], 'new_z' : {'new_foo' ....
4

2 に答える 2

0

結果のコードで「いくつかのフィールド」を削除する必要があるという要件について言及しました。辞書とリストを処理する再帰ループを使用して、すべてのキーを変更し、new_指定したフィールドを削除できます。

a = {
  'a' : 1,
  'b' : 1,
  'd' : {'d1' : '1', 'd2' : 2},
  'm' : [
    {'x' : 6, 'y' : 5, 'z' : {'foo' : 'foo1', 'bar' : 'bar1'} },
    {'x' : 8, 'y' : 8, 'z' : {'foo' : 'foo2', 'bar' : 'bar2'} }
  ]
}

def rename(dt):
    ndt = {}
    for k, v in dt.iteritems():
        if k == 'y':  # the keys that you wish to remove from the new dictionary
            continue
        if isinstance(v, dict):
            ndt['new_' + k] = rename(v)
        elif isinstance(v, list):
            ndt['new_' + k] = [rename(x) for x in v]
        else:
            ndt['new_' + k] = v
    return ndt

print rename(a)  # your expected dictionary

構造的な再編成が必要な場合 (たとえば、値を別の場所に移動したい場合や、既存の命名規則に従いたくない場合)、既存のコードが最もクリーンな方法です。

于 2013-11-08T06:04:03.210 に答える
0

単純な再帰的な解決策は次のとおりです。

def patch_keys(d, func):
    """
    For a given dictionary `d`, recursively applies `func` to its keys,
    filtering out those with `func(key)` evaluated to False. 
    For a list or tuple, applies `patch_keys` to each element.

    Intended usage:
    >>> patch_keys({1: 'a', 2: 'b'}, lambda x: x-1)
    {1: 'b'}
    """
    # we want to recursively apply self, i.e. `patch_keys(..., func=func)`
    # here functools.partial comes in handy
    self = partial(patch_keys, func=func)
    if isinstance(d, dict):
        # for a dict, apply self to values
        return {func(k): self(v) for k, v in d.items() if func(k)}
    elif isinstance(d, (list, tuple)):
        # for list and tuples, apply self to each element
        return type(d)(map(self, d))
    else:
        # else return as is
        return copy.deepcopy(d)

結果:

>>> old_data = {
...   'a' : 1,
...   'b' : 1,
...   'd' : {'d1' : '1', 'd2' : 2},
...   'm' : [
...     {'x' : 6, 'y' : 5, 'z' : {'foo' : 'foo1', 'bar' : 'bar1'} },
...     {'x' : 8, 'y' : 8, 'z' : {'foo' : 'foo2', 'bar' : 'bar2'} }
...   ]
... }
>>>

>>> patch_keys(old_data, new_keys)
{'new_d': {'new_d2': 2, 'new_d1': '1'}, 'new_m': [{'new_z': {'new_foo': 'foo1', 'new_bar': 'bar1'}}, {'new_z': {'new_foo': 'foo2', 'new_bar': 'bar2'}}], 'new_b': 1, 'new_a': 1}
于 2013-11-08T06:05:46.237 に答える