2016-09-11 3 views
-3

Ich habe eine Liste der Wörterbücher wie unten:Python entfernen Obect von Array Zustand

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

Wie ich 'property3' : 'value6' von oben Liste der Wörterbücher entfernen?

Um genau zu sein, muss ich alle Instanzen des Schlüssels ('property3') mit spezifischen Wert ('value6') aus allen Wörterbüchern in der Liste entfernen?

Ich brauche die schnellste Methode, weil Liste kann sehr groß sein.

+3

Warum erzählst du uns nicht, was du bereits versucht hast und was nicht funktionierte? –

+2

Dies ist keine Website, wo Leute Code für Sie schreiben ... es ist eine Website, wo Leute Ihnen helfen, Probleme mit Ihrem vorhandenen Code zu lösen –

Antwort

1

Dies sollte es tun. Ziemlich geradlinig, also werde ich es nicht erklären. Viel Glück

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

Sorry, ich habe nicht bemerkt, dass das Poster nur bestimmte Eigenschaften entfernen wollte. Hier ist die richtige Lösung:

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

LazyScripter Lösung wird Wörterbuch Elemente löschen, wo der Schlüssel oder der Wert ODER beide übereinstimmen. Wenn ich die ursprüngliche Frage verstehe, glaube ich nicht, dass dies gewünscht ist.

Ich habe im Vergleich auch die Effizienz der beiden vorgeschlagenen Lösungen und die Einzeiler scheint über 12X schneller ...

python -m cProfile test.py 

Ausgänge zu sein:

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) 
    ... 

Für den folgenden Code :

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

Sollte das nicht "und" statt "oder" sein? –

+0

Die Anwendung des DeMorgan-Satzes auf "nicht (a und b)" ergibt "nicht (a) oder nicht (b)". Letzteres ist prägnanter und kann (oder auch nicht) klarer sein. – EdC

Verwandte Themen