Python dict重组

时间:2012-08-16 11:26:14

标签: python dictionary generator

鉴于以下数据结构:

out = {
  'foo': { 'public':{}, 'private':{}, 'other':{} },
  'bar': { 'public':{}, 'private':{}, 'other':{} }
}

我正在尝试切片输出子结构的某些部分以创建新的dict。我的用途是响应所有标记为private以外的数据的请求。

相反的做法是微不足道的:

response = {x,y['private'] for x,y in out.iteritems()}

为每个foobar构建一个dict,仅包含标记为private的数据。但是标准库(也许是itertools)中是否有一些功能会产生以下结果:

out = {
  'foo': { 'public':{}, 'other':{} },
  'bar': { 'public':{}, 'other':{} }
}

我尝试了以下内容:

{x:(y['public'], y['other']) for x,y in out.iteritems()}

虽然我宁愿不使用元组,也没有明确命名每个子结构,因为这不是可重用的或可扩展的。

def remove(name, obj):
    return {x:y for x,y in obj.iteritems() if x is not name}
{x:remove('private',y) for x,y in out.iteritems()}

这似乎有效,但还有更好的方法吗?有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你可以把它分解成几部分;你想要一个删除了一些部分的新词典。因此,创建一个函数,可以返回没有相关元素的字典,并调用它是迭代器的一部分。

你正在使用词典理解,所以这样的事情会起作用:

def remove_items(d, *items):
    """
    Return dictionary copy with some items removed.
    """
    return { a: b for a, b in d.iteritems() if a not in items }

print { x: remove_items(y, 'private') for x, y in out.iteritems() }

答案 1 :(得分:0)

这就是你的意思吗?

respose = {x:{'public': y['public'], 'other': y['other']} for x,y in out.iteritems()}

答案 2 :(得分:0)

试试这个:

response = {}
for x,y in out.iteritems():
    response[x] = dict(y)
    del response[x]['private']

如果您不介意销毁原始字典,那么只需迭代del'私有'元素,否则您需要复制第二级dicts然后del不需要的项目