Python 基于值筛选defaultdict

Python 基于值筛选defaultdict,python,defaultdict,Python,Defaultdict,考虑以下默认命令: data = defaultdict(list) data['key1'] = [{'check': '', 'sth1_1':'k1', 'sth1_2':'k2'}] data['key2'] = [{'check': '0', 'sth2_1':'k3'}, {'check': 'asd', 'sth2_2':'k4'}, {'check':'1', 'sth2_3':'k5'}] 等等 我想从data字典(从data.values())中筛选出哪个值'check'!

考虑以下默认命令:

data = defaultdict(list)
data['key1'] = [{'check': '', 'sth1_1':'k1', 'sth1_2':'k2'}]
data['key2'] = [{'check': '0', 'sth2_1':'k3'}, {'check': 'asd', 'sth2_2':'k4'}, {'check':'1', 'sth2_3':'k5'}]
等等

我想从
data
字典(从data.values())中筛选出哪个值
'check'!='1'

对于上述给定输入,我希望:

defaultdict(<type 'list'>, {'key2': [{'sth2_3': 'k5', 'check': '1'}])
但是它给了我不需要的
'key1':[]
:

defaultdict(<type 'list'>, {'key2': [{'sth2_3': 'k5', 'check': '1'}], 'key1': []})
defaultdict(,{'key2':[{'sth2_3':'k5','check':'1'},'key1':[]))

解决这个问题的最好办法是什么

这将在适当的位置完成。如果你可以编一本新字典,它可以被清理一下

for key in data.keys():
    new_list = []
    for val in data[key]:
        if val['check'] == '1':
            new_list += [val]
    if new_list:
        data[key] = new_list
    else:
        del data[key]
如果您真的想使用(嵌套的)理解,这也可以:

d = {}
d = {key: [inner_dict for inner_dict in list_of_dicts if inner_dict['check'] == '1'] for key, list_of_dicts in data.iteritems()}
d = {key: val for key,val in d.iteritems() if val}

我认为这很简单:

for k,v in data.items():
    filtered_vals = list(filter(lambda i: i['check'] == '1', v)
    if len(filtered_vals):
        data[k] = filtered_vals
    else:
        del data[k]
或者如果你疯了:

data = {k:v for k,v in { k:list(filter(lambda i: i['check'] == '1' ,v)) for k, v in data.items()}.items() if len(v)}

为什么
'key1':[]
不需要?当
d.get('check')==“1”
给出
False
时,
v[:]
将是一个空列表。那么你想删除
key1
吗?很遗憾,是的,我需要让过滤后的dict只包含满足规定条件的键值。过滤器的使用很好!FWIW,python列表具有隐式布尔性质。所以你可以用if x替换if len(x):当x是一个列表时是的,我看到了,但我计算了五个字符,以增加我们实际检查的内容的清晰度,这将有助于提高可读性。最后,我还发现了另一个过滤规则-解决了将解决方案的第二行编辑为:
filtered\u vals=list的问题(过滤器(检查列表中的lambda i:i['check']='1'和i['check2'],v))
目前运行良好!
data = {k:v for k,v in { k:list(filter(lambda i: i['check'] == '1' ,v)) for k, v in data.items()}.items() if len(v)}