使用另一个字典中的值子集提取字典

时间:2016-01-18 14:12:00

标签: python dictionary extract sublist

我有一个字典,想要从其值列表中删除bad_list中的某些值,然后返回余数。这是代码:

d = {1: ['a', 'c', 'd'], 2: ['b'], 5: ['e']}

bad_list = ['d','e']

ad = {k:d[k].remove(i) for k in d.keys() for sublist in d[k] for i in sublist if i in bad_list}

print 'd =', d

print 'ad =', ad

不幸的是,它会永久更改d中的值,并为广告中的值返回None

d =  {1: ['a', 'c'], 2: ['b'], 5: []}

ad =  {1: None, 5: None}

如何获得如下字典:

new_dict = {1: ['a','c'], 2:['b']}

没有循环?我有一个更大的字典要处理,我想以最有效的方式做到这一点。

3 个答案:

答案 0 :(得分:2)

没有循环就无法做到:

Update-Database -ProjectName EventsApp.Contexts -YourOtherOptions

或使用过滤器:

d = dict((key, [x for x in value if x not in bad_list]) for key, value in d.iteritems())

更新

要排除空值:

d = dict((key, filter(lambda x: x not in bad_list, d[key])) for key in d)

答案 1 :(得分:0)

嗯,你可以使用' list comprehension',这个衬里有效,我觉得我觉得这很难看。

ad = {k:v for k,v in {k:[i for i in v if i not in bad_list] for k,v in d.items()}.items() if v}

我最好使用for循环。

ad2 = dict()
for k,v in d.items():
    _data_ = [item for item in v if item not in bad_list]
    if _data_:
        ad2[k]=_data_

输出:

print 'd =', d
print 'ad =', ad
print 'ad2=', ad2

>d = {1: ['a', 'c', 'd'], 2: ['b'], 5: ['e']}
>ad = {1: ['a', 'c'], 2: ['b']}
>ad2= {1: ['a', 'c'], 2: ['b']}

答案 2 :(得分:0)

以下使用Python 3.5编写的代码似乎按照您的问题要求执行。它需要进行最小的更改才能与Python 2.x一起使用。只需使用print语句而不是函数。

d = {1: ['a', 'c', 'd'], 2: ['b'], 5: ['e']}
bad_list = ['d', 'e']
ad = {a: b for a, b in ((a, [c for c in b if c not in bad_list]) for a, b in d.items()) if b}
print('d =', d)
print('ad =', ad)