2016-09-11 2 views
-3

У меня есть список словарей, как показано ниже:питон удалить obect из массива, используя условие

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

Как я могу удалить 'property3' : 'value6' из вышеупомянутого списка словарей?

Чтобы быть точным, мне нужно удалить все экземпляры ключа ('property3') с определенным значением ('value6') из всех словарей в списке?

Мне нужен быстрый метод, потому что список может быть разным.

+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 будет удалять элементы словаря, где ключ или значение 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') 
+0

Не должно быть 'и' вместо' или'? –

+0

Применение теоремы ДеМоргана к "not (a и b)" дает "не (a) или нет (b)". Последний является более кратким и может (или не может) быть более четким. – EdC

Смежные вопросы