我有一本字典d1
和一个清单l1
。
字典键是字符串,值是我自己定义的对象。如果有帮助,我可以更详细地描述 Object 但现在,这些对象有一个 list 属性names
,并且 的某些元素name
可能出现在l1
.
我想要做的是丢弃字典中的任何元素d1
,其中name
所述元素中对象的属性不包含任何出现在l1
.
作为一个简单的例子:
l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant',
'zebra', 'lion', 'snake', 'fly']
d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
'2':['apple', 'pear','cat', 'mouse', 'horse'],
'3':['kiwi', 'lime','cat', 'dog', 'mouse'],
'4':['carrot','potato','cat', 'dog', 'horse'],
'5':['chair', 'table', 'knife']}
所以结果字典将或多或少相同,但每个列表的元素将是键值对从1
到4
排除水果和蔬菜,并且不会包含第 5 个键值对,因为没有家具值出现在l1
.
为此,我使用了一个嵌套列表/字典理解,如下所示:
d2 = {k: [a for a in l1 if a in d1[k]] for k in d1.keys()}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'5': [],
'4': ['cat', 'dog', 'horse']}
d2 = {k: v for k,v in d2.iteritems() if len(v)>0}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'4': ['cat', 'dog', 'horse'],}
这似乎可行,但对于包含 7000 多个项目的大型词典,大约需要 20 秒才能完成。就其本身而言,并不可怕,但我需要在一个循环中执行此操作,该循环将迭代 10,000 次,因此目前它不可行。关于如何快速做到这一点的任何建议?