具有公共子键的新词典

2024-04-20 15:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一本字典,如下所示:

{
    'key1':
        {
            'foo': 1233,
            'bar': 1234,
            'baz': 122
        },
    'key2':
        {
            'foo': 113,
            'bar': 333
        }
}

如何返回具有以下结果的新词典

{
    'key1':
        {
            'foo': 1233,
            'bar': 1234
        },
    'key2':
        {
            'foo': 113,
            'bar': 333
        }
}

我想要副字典(这个词对吗?)“key1”和“key2”的键相同


Tags: 字典foobarbaz词典key2key1
3条回答

我试图回答。。。真的不喜欢极限lambda:S

def result_get_mutual(result):
    return result_keep_mutual(
        result,
        result.iterkeys(),
        reduce(
            lambda current, incoming:
                current.intersection(incoming),
            map(
                lambda base_data: set(base_data[1].iterkeys()),
                result.iteritems())))


def result_keep_mutual(result, base_dict, sub_dict_common):
    return reduce(
        lambda current, base_data:
            base_get_common(current, base_data, sub_dict_common),
        result.iteritems(),
        {})

def base_get_common(result, base_data, sub_dict):
    result.update({
        base_data[0]: reduce(
            lambda result, sub_incoming:
                base_rebuild_ping(result, sub_incoming, base_data[1][sub_incoming]),
            sub_dict,
            {})
        });

    return result;

def base_rebuild_ping(result, sub, ping):
    result.update({ sub: ping })

    return result

print result_get_mutual({
    'key1':
        {
            'foo': 1233,
            'bar': 1234,
            'baz': 122
        },
    'key2':
        {
            'foo': 113,
            'bar': 333
        }
});

这应该做到:

>>> d = { 'key1': { 'foo': 1233, 'bar': 1234, 'baz': 122 }, 'key2': { 'foo': 113, 'bar': 333 } }
>>> keys = (x.keys() for x in d.itervalues())
>>> common_keys = set(next(keys)).intersection(*keys)
>>> {k : {k_: v[k_] for k_ in common_keys} for k, v in d.iteritems()}

{'key2': {'foo': 113, 'bar': 333},
 'key1': {'foo': 1233, 'bar': 1234}}

另一个答案是:

def func(a):
    res = {}
    keys = a.keys()
    common = reduce(lambda x, y: x & y, [set(a[i].keys()) for i in keys])
    for k in keys:
        temp = {}
        for c in common:
            temp[c] = a[k][c]

        res[k] = temp

    return res

相关问题 更多 >