我有一个dicts列表:
list = [{'title': u'Politics', 'id': 1L, 'title_url': u'Politics'},
{'id': 3L, 'title_url': u'Test', 'title': u'Test'}]
我想删除标题为'Test'的列表项
如果键/值对的顺序发生变化,最好的方法是什么?
感谢。
答案 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)