【问题标题】:In python, a good way to remove a list from a list of dicts在python中,从字典列表中删除列表的好方法
【发布时间】:2010-05-20 22:13:53
【问题描述】:

我有一个字典列表:

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

我想删除 title = 'Test' 的列表项

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

谢谢。

【问题讨论】:

  • 键/值对的顺序是什么意思? dict 中没有任何您应该关心的顺序。

标签: python list dictionary


【解决方案1】:
[i for i in lst if i['title']!= u'Test']

另外,请不要使用list 作为变量名,它会影响内置。

【讨论】:

  • 你想要 !=,而不是 ==。他只想删除那个项目。
【解决方案2】:
mylist = [x for x in mylist if x['title'] != 'Test']

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

【讨论】:

    【解决方案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 这样的内置函数的名称作为变量名是个坏主意。

    【讨论】:

      【解决方案4】:

      比上述答案更详细,但修改列表而不是创建它的副本(不知道哪个会更快 - 无论如何复制可能是要走的路!)

      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]  
      

      修改列表而不是复制它,处理删除多个包含“title”:“Test”的字典,并在没有这样的字典时处理。

      请注意,如果没有匹配的键,.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"]
      

      【讨论】:

        【解决方案5】:
        new_lst = filter(lambda x: 'title' in x and x['title']!=u'Test', lst)
        

        【讨论】:

          猜你喜欢
          • 2020-07-14
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多