鉴于以下数据结构:
out = {
'foo': { 'public':{}, 'private':{}, 'other':{} },
'bar': { 'public':{}, 'private':{}, 'other':{} }
}
我正在尝试切片输出子结构的某些部分以创建新的dict
。我的用途是响应所有标记为private
的除以外的数据的请求。
相反的做法是微不足道的:
response = {x,y['private'] for x,y in out.iteritems()}
为每个foo
和bar
构建一个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()}
这似乎有效,但还有更好的方法吗?有什么想法吗?
答案 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
不需要的项目