2016-09-11 24 views
-3

從數組中刪除obect我有字典列表象下面這樣:蟒使用條件

tt = [ 
{ 
    'property1': 'value1', 
    'property2': 'value2', 
    'property3': 'value3' 
}, 
{ 
    'property1': 'value4', 
    'property2': 'value5', 
    'property3': 'value6' 
}, 
.............................. 
............................. 
] 

如何可以從上面的字典列表中刪除'property3' : 'value6'

準確地說,我需要從列表中的所有字典中刪除具有特定值('value6')的鍵('property3')的所有實例?

我需要最快的方法,因爲列表可以變化很大。

+3

爲什麼你不告訴我們你已經試過什麼,什麼是不工作? –

+2

這不是一個人們爲你寫代碼的網站......它是一個人們幫助你解決現有代碼問題的網站 –

回答

1

這應該做到這一點。相當直接,所以我不會解釋它。好運

def search(dict, key=None, val=None): 
    c_dict = copy.deepcopy(dict) 
    for i, n in enumerate(dict): 
     for k, v in n.iteritems(): 
      if key and val and k == key and val == v: 
       c_dict[i].pop(k) 
      elif key and k == key: 
       c_dict[i].pop(k) 
      elif v and val == v: 
       c_dict[i].pop(k) 
      else: 
       continue 
    return c_dict 

print search(d, 'property3', 'value6') 
0

對不起,我沒注意到海報只是想刪除特定的屬性。下面是正確的解決方案:

tt=[{k:v for k,v in i.items() if k != 'property3' or v != 'value6'} for i in tt] 

LazyScripter的解決方案將刪除字典元素,其中的鍵或值或兩者相匹配。如果我理解了原始問題,我不認爲這是所期望的。

我還比較了兩種提議的解決方案的效率和一個班輪似乎是約12倍快...

python -m cProfile test.py 

輸出:

1780059 function calls (1500059 primitive calls) in 2.759 seconds 

    ncalls tottime percall cumtime percall filename:lineno(function) 
    ... 
     1 0.026 0.026 2.759 2.759 test.py:1(<module>) 
     1 0.036 0.036 0.917 0.917 test.py:19(search) 
     1 0.035 0.035 0.073 0.073 test.py:33(search2) 
    ... 

對於下面的代碼:

import copy 

tt = [ 
{ 
    'property1': 'value1', 
    'property2': 'value2', 
    'property3': 'value3' 
}, 
{ 
    'property1': 'value4', 
    'property2': 'value5', 
    'property3': 'value6' 
} 
] 

d=[] 
[d.extend(copy.deepcopy(tt)) for _ in range(10000)] 

def search(dict, key=None, val=None): 
    c_dict = copy.deepcopy(dict) 
    for i, n in enumerate(dict): 
     for k, v in n.iteritems(): 
      if key and val and k == key and val == v: 
       c_dict[i].pop(k) 
#   elif key and k == key:                                         
#    c_dict[i].pop(k)                                         
#   elif v and val == v:                                         
#    c_dict[i].pop(k)                                         
      else: 
       continue 
    return c_dict 


def search2(d,a,b): 
    return [{k:v for k,v in i.items() if k != a or v != b} for i in d] 

search (d, 'property3', 'value6') 

search2(d, 'property3', 'value6') 
+0

不應該用'和'來代替'或'嗎? –

+0

將德摩根定理應用於「不(a和b)」給出「不(a)或不(b)」。後者更簡潔,可能(或可能不)更清楚。 – EdC