3

リスト、辞書、文字列、および整数を含む辞書を持っている場合、その辞書をコピーするにはどうすればよいですか。

old_dictこの関数をフィルタリングすると、 が得られますnew_dict。ホワイト リストに記載されたキーはどのような形式でもかまいませんが、ソリューションは任意のホワイト リストに記載されたキーのオブジェクトを取得して出力を生成できる必要があります。

old_dict = [
    {
        'name': {'first': "John", 'last': "Doe"},
        'groups': ["foo", "bar"],
        'widgets': [
            {'id': 0, 'name': "Acme"},
            {'id': 1, 'name': "Anvil"},
        ],
    },

    {
        'name': {'first': "David"},
        'groups': ["bar", "bash", "ding"],
        'widgets': [
            {'id': 1, 'name': "Anvil"},
            {'id': 8, 'name': "Bingo"},
        ],
    },
]

new_dict = [
    {
        'name': {'last': "Doe"},
        'widgets': [
            {'name': "Acme"},
            {'name': "Anvil"},
        ],
    },

    {
        'name': { },
        'widgets': [
            {'name': "Anvil"},
            {'name': "Bingo"},
        ],
    },
]
4

2 に答える 2

1
new_dict = []
for dic in old_dic:
    new_dict.append({})
    for key in white_list: #list of keys
        if key in dic:
            new_dict[key] = old_dic[key]

次のようにリスト内包に入れることができます:

new_dic = [ dict( key, old_dic[key])
                 for key in whitelist
                 if key in old_dic)
            for dic in old_dic ]
于 2012-09-18T23:41:45.847 に答える
1

各タイプを処理し、dict が表示されるたびに除外する再帰関数を作成します。

def keep_only(keys, val):
    if type(val) is list:
        return [keep_only(keys, v) for v in val]
    if type(val) is dict:
        return dict((k, keep_only(keys, v)) for k,v in val.items() if k in keys)
    return val

使用例:

>>> old_dict = [
    {
        'name': {'first': "John", 'last': "Doe"},
        'groups': ["foo", "bar"],
        'widgets': [
            {'id': 0, 'name': "Acme"},
            {'id': 1, 'name': "Anvil"},
        ],
    },

    {
        'name': {'first': "David"},
        'groups': ["bar", "bash", "ding"],
        'widgets': [
            {'id': 1, 'name': "Anvil"},
            {'id': 8, 'name': "Bingo"},
        ],
    },
]
>>> keep_only(set(['name', 'widgets', 'last']), old_dict)
[{'widgets': [{'name': 'Acme'}, {'name': 'Anvil'}], 'name': {'last': 'Doe'}}, {'widgets': [{'name': 'Anvil'}, {'name': 'Bingo'}], 'name': {}}]
于 2012-09-18T23:45:17.237 に答える