在python中,一种从dicts列表中删除列表的好方法

时间:2010-05-20 22:13:54

标签: python list dictionary

我有一个dicts列表:

list =  [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'}, 
         {'id': 3L, 'title_url': u'Test', 'title': u'Test'}]

我想删除标题为'Test'的列表项

如果键/值对的顺序发生变化,最好的方法是什么?

感谢。

5 个答案:

答案 0 :(得分:6)

[i for i in lst if i['title']!= u'Test']

另外,请不要将list用作变量名称,它会内置阴影。

答案 1 :(得分:4)

mylist = [x for x in mylist if x['title'] != 'Test']

其他解决方案也是可行的,但任何解决方案都是O(n),因为您必须在整个列表中搜索正确的元素。鉴于此,采用最简单的方法。

答案 2 :(得分:3)

L = [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'}, 
     {'id': 3L, 'title_url': u'Test', 'title': u'Test'}]
L = [d for d in L if d['title'] != u'Test']

提示:无论如何都不会订购dict中的商品。使用像list这样的内置函数的名称作为变量名是个坏主意。

答案 3 :(得分:3)

比上面的答案更详细但是修改了列表而不是创建它的副本(不知道哪个更快 - 复制可能是最好的方式!)

lst =  [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'},  
    {'id': 3L, 'title_url': u'Test', 'title': u'Test'}]  
for i in xrange(len(lst)-1,0,-1):  
if lst[i].get("title")=="Test":  
    del lst[i]  

修改列表而不是复制它,应对删除多个具有“标题”的词典:“测试”,如果没有这样的词典则应对。

注意.get(“title”)如果没有匹配的键则返回None,而[“title”]引发异常。

如果你能保证只有一个匹配的项目你也可以使用(并且想要在适当的位置进行修改而不是复制)

for i,d in enumerate(lst):  
    if d.get("title")=="Test":  
        del lst[i]  
        break  

可能最简单的坚持

[x for x in lst if x.get("title")!="Test"]

答案 4 :(得分:0)

new_lst = filter(lambda x: 'title' in x and x['title']!=u'Test', lst)