0

A 有这样的字典:

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

如果你只需要保留1s 那么你实际上不需要过滤任何东西,你可以对序列求和以获得1s 的数量并创建一个包含那么多1s 的新序列。

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

如果您宁愿使用循环而不是 dict 理解:

>>> 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 回答