python使用条件从数组中删除对象
我有一个字典列表,如下所示:python使用条件从数组中删除对象,python,python-3.x,Python,Python 3.x,我有一个字典列表,如下所示: tt = [ { 'property1': 'value1', 'property2': 'value2', 'property3': 'value3' }, { 'property1': 'value4', 'property2': 'value5', 'property3': 'value6' }, .............................. .....................
tt = [
{
'property1': 'value1',
'property2': 'value2',
'property3': 'value3'
},
{
'property1': 'value4',
'property2': 'value5',
'property3': 'value6'
},
..............................
.............................
]
如何从上述词典列表中删除'property3':'value6'
确切地说,我需要从列表中的所有字典中删除具有特定值('value6')的key('property3')的所有实例
我需要最快的方法,因为列表可能变化很大。这应该可以做到。相当直截了当,所以我不会解释。祝你好运
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')
抱歉,我没有注意到海报只想删除特定属性。以下是正确的解决方案:
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)
...
你为什么不告诉我们你已经尝试了什么,哪些不起作用?这不是一个人们为你编写代码的网站。。。这是一个人们帮助你解决现有代码问题的网站,这不应该是
和而不是或?将DeMorgan定理应用于“not(a和b)”给出“not(a)或not(b)”。后者更简洁,可能(也可能不)更清楚。
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')