2013-10-31 68 views
0

我想優化這段代碼:優化雙迴路枚舉

for MajorKey,v in enumerate(data): 
    for MinorKey,e in enumerate(v['events']): 
     if e['displayed'] == False: 
      del data[MajorKey]['events'][MinorKey] 

結構:

data : [{ //details, 
     "events" :[ { //more details, 
         "displayed" : True}, 
         { //more details, 
         "displayed" : False} 
        ] 
     }, 
     { //... 
     }] 

data是一個列表。數據中的每個對象都有一個'events'數組。在這些對象中,我想刪除那些有display == false的對象。

回答

2

不要枚舉,也不要刪除(,尤其是,如果您正在迭代要刪除的序列)。切片 - 代替列表理解。

for v in data.itervalues(): 
    v['events'][:] = [e for e in v['events'] if e['displayed']] 
+0

謝謝。使用'.itervalues()'但是我得到:''list'對象沒有屬性'itervalues''。問題是,爲什麼切片分配更優化?它處理得更快或類似的東西? – Diolor

+0

@Diolor'itervalues()'是python2語法;它只是python3中的'values()'。 – roippi

+0

@Diolor:你確定你問題的結構是否準確?您切片分配,因爲那樣您就不必關心原始值的位置。 –