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')
Warum erzählst du uns nicht, was du bereits versucht hast und was nicht funktionierte? –
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 –