0

次のような辞書があります。

dict = {
 'a':
    {'a1':(1,0,0,1,0), 'a2':(1,1,1,0,0)},
 'b':
    {'b1':(1,1,0,1,1), 'b2':(1,0,1,0,0)}
}

私が欲しいのは、dictとまったく同じように新しい辞書を作成することですが、タプルにゼロはありません

dict_new = {
 'a':
    {'a1':(1,1), 'a2':(1,1,1)},
 'b':
    {'b1':(1,1,1,1), 'b2':(1,1)}
} 

以下は正しいです。

 >>> a = (1,0,0,1)
 >>> filter(lambda x: x!= 0,a)
 >>> (1,1)

だから、私がやろうとしていることは

 dict_new = filter(
     lambda x: filter(
       lambda y: dict[x][y]!=0), dict[x]), dict)

しかし、答えは

['a', 'b']

私は何を間違っていますか?そして、それはこのようなことをすることは可能ですか?

4

3 に答える 3

4

ネストされた構造をループして、フィルターを内部の値にのみ適用する必要があります。辞書内包表記はそのためにうまく機能します:

dict_new = {kouter: {kinner: tuple(filter(bool, vinner)) for kinner, vinner in vouter.iteritems()} 
            for kouter, vouter in dict_old.iteritems()}

デモ:

>>> {kouter: {kinner: tuple(filter(bool, vinner)) for kinner, vinner in vouter.iteritems()} 
...             for kouter, vouter in dict_old.iteritems()}
{'a': {'a1': (1, 1), 'a2': (1, 1, 1)}, 'b': {'b1': (1, 1, 1, 1), 'b2': (1, 1)}}
于 2013-03-29T16:41:18.787 に答える
0

sのみを保持する必要がある場合1は、実際には何もフィルタリングする必要はありません。シーケンスを合計して s の数を取得し、その数の1s を含む新しいものを作成できます1

dict_input = {
 'a':
    {'a1':(1,0,0,1,0), 'a2':(1,1,1,0,0)},
 'b':
    {'b1':(1,1,0,1,1), 'b2':(1,0,1,0,0)}
}

dict_output = {}

for key, subdict in dict_input.iteritems():
   dict_output[key] = {}
   for subkey, items in subdict.iteritems():
       dict_output[key][subkey] = (1,) * sum(items)
于 2013-03-29T16:58:07.167 に答える
0

辞書内包表記よりもループが必要な場合:

>>> print adict
{'a': {'a1': (1, 0, 0, 1, 0), 'a2': (1, 1, 1, 0, 0)}, 'b': {'b1': (1, 1, 0, 1, 1), 'b2': (1, 0, 1, 0, 0)}}
>>> newdict = {}
>>> for k in dict:
...   newdict[k] = {}
...   for k2 in adict[k]:
...     newdict[k][k2] = filter(lambda x: x!=0, adict[k][k2])
... 
于 2013-03-29T16:43:51.750 に答える