我有一个字典 d1
和一个列表 l1
。
字典的键是字符串,值是我自己定义的对象。如果需要,我可以更详细地描述这个对象,但现在对象具有列表属性 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(不包括水果和蔬菜)的键值对,并且不会包含第五个键值对,因为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秒才能完成。这本身并不可怕,但我需要在一个循环内执行此操作,该循环将迭代10000次,因此目前不可行。有什么快速实现的建议吗?
itertitems
,不要被print()
所迷惑。 - jamylakfor k in d1
这样可以迭代的字典。默认情况下,字典会按键进行迭代,在 Python 2.7 中,dict.keys
返回一个列表。另一个原因是你正在检查一个列表的成员资格,你永远不想这样做,因为它的运行时间是 O(N)。然而,检查一个集合的成员资格只需要 O(1) 的时间。 - jamylak