Извините, я не заметил, что плакат только хотел удалить определенные свойства. Вот правильное решение:
tt=[{k:v for k,v in i.items() if k != 'property3' or v != 'value6'} for i in tt]
решение LazyScripter будет удалять элементы словаря, где ключ или значение OR и матч. Если я понимаю исходный вопрос, я не думаю, что это то, что было желательным.
Я также сравнили эффективность двух предложенных решений и один вкладыш, кажется, около 12X быстрее ...
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')
Почему бы вам не рассказать нам, что вы уже пробовали и что не работает? –
Это не сайт, где люди пишут код для вас ... это веб-сайт, где люди помогают вам решать проблемы с вашим существующим кодом. –