0

次のデータ構造があるとします。

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

部分構造の一部を切り取って、新しいを作成しようとしていますdict。これの私の使用法は、マークされたものを除くすべてのデータでリクエストに応答することprivateです。

反対のことをするのは簡単です:

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

これは、それぞれのdictを構成し、 。とマークされたデータのみfooを含みます。しかし、標準ライブラリ(おそらくitertools)には、次のような機能がいくつかあります。barprivate

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()}

これはうまくいくようですが、もっと良い方法はありますか?何か案は?

4

3 に答える 3

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() }
于 2012-08-16T11:55:06.333 に答える
0

それはあなたが意味することでしょうか?

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

于 2012-08-16T11:41:24.740 に答える
0

これを試して:

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

元の辞書を破棄してもかまわない場合はdel、「プライベート」要素を繰り返し処理します。それ以外の場合は、第2レベルの辞書をコピーしてからdel、不要なアイテムをコピーする必要があります。

于 2012-08-16T11:58:02.777 に答える