我有一本字典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