python使用条件从数组中移除obect

2024-04-25 08:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表如下:

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

如何从上述词典列表中删除'property3' : 'value6'?你知道吗

准确地说,我需要从列表中的所有字典中删除具有特定值('value6')的key('property3')的所有实例?你知道吗

我需要最快的方法,因为列表可能变化很大。你知道吗


Tags: 实例key列表字典词典ttvalue1value2
2条回答

这样就可以了。很直截了当,所以我就不解释了。祝你好运

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

对于以下代码:

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

相关问题 更多 >