如何删除dicts列表中特定键的所有项?

时间:2009-06-29 19:05:35

标签: python

我正在尝试根据密钥删除某些dict项,这是我的代码:

d1 = {'a': 1, 'b': 2}
d2 = {'a': 1}

l = [d1, d2, d1, d2, d1, d2]

for i in range(len(l)):
    if l[i].has_key('b'):
        del l[i]['b']

print l

输出将是:

[{'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}]

有更好的方法吗?

4 个答案:

答案 0 :(得分:16)

d1 = {'a': 1, 'b': 2}
d2 = {'a': 1}
l = [d1, d2, d1, d2, d1, d2]
for d in l:
    d.pop('b',None)
print l

答案 1 :(得分:3)

略有简化:

   for d in l:
      if d.has_key('b'):
         del d['b']

有些人也可能会这样做

   for d in l:
      try:
         del d['b']
      except KeyError:
         pass

在Python中捕获这样的异常并不像其他语言那样昂贵。

答案 2 :(得分:2)

我喜欢你这样做的方式(除了你使用循环变量,但其他人已经指出了),它是明确的,易于理解。如果你想要一些可以减少输入的东西,那么这就可以了:

[x.pop('b',None)for x in l]

请注意,只有一个'b'会被删除,因为你的列表l引用了词典。所以在上面运行你的代码,然后打印出d1,你会注意到你实际上也从d1中删除了b键。

为避免这种情况,您需要复制词典:

d1 = {'a': 1, 'b': 2}
d2 = {'a': 1}

l = [d1.copy(), d2.copy(), d1.copy(), d2.copy(), d1.copy(), d2.copy()]
[b.pop('b', None) for b in l]

d1现在将保留b键。

答案 3 :(得分:0)

d1 = {'a':1,'b':2} d2 = {'a':1}

l = [d1,d2,d1,d2,d1,d2]

表示范围内的i(len(l)):     如果l [i] .has_key('b'):         del l [i] ['b']

print l

以下是对您的代码的一些评论:

  1. 在列表上迭代不像在C中那样完成。如果你不需要引用列表索引,最好使用l中的项目,然后用项目替换l [i]。
  2. 对于密钥存在测试,您可以在l [i]
  3. 中写入'b'

    所以你的代码变成了:

    for item in l:
        if 'b' in item:
            del item['b']
    

    还需要注意的另一件事是,在第一次调用del的迭代中,实际上你将删除所有你需要的东西,因为d1是可变的。你需要认为d1是一个引用,而不是值(有点像C中的指针)。

    正如Lennart Regebro提到的那样,为了优化你的代码,你也可以使用列表理解。