我有一本字典d1
和列表l1
。Python字典的理解很慢
字典键是字符串,值是我定义自己的对象。如果有帮助,我可以描述对象更详细,但就目前而言,对象有一个列表属性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次迭代,因此目前不可行。有关如何快速做到这一点的任何建议?
注意给大家:他是用Python 2.7版不是3,由于使用'itertitems',不要让打印' ()'骗你 – jamylak 2012-08-10 14:08:16
python 2.7有词典理解吗? – Claudiu 2012-08-10 14:12:47
@Claudiu是的,他们是backported – jamylak 2012-08-10 14:13:49