Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何删除DICT列表中特定键的所有项?_Python - Fatal编程技术网

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

Python 如何删除DICT列表中特定键的所有项?,python,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}] 有更

我正试图根据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}]

有更好的方法吗?

稍微简化一下:

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
   for d in l:
      if d.has_key('b'):
         del d['b']
有些人可能也会这样做

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

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

我喜欢您这样做的方式(除了您使用循环变量,但其他人已经指出了这一点),它是可扩展的,易于理解。如果您想要尽量减少键入的内容,则此操作有效:

[x.pop('b',无)表示l中的x]

但是请注意,只有一个“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键。

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

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

对于范围内的i(len(l)): 如果l[i]具有_键('b'): del l[i][b']

打印l

下面是对您的代码的一点回顾:

  • 在列表上进行迭代并不像在C中那样。如果您不需要引用列表索引,那么最好将其用于l中的项,然后用项替换l[i]
  • 对于密钥存在性测试,您只需在l[i]中写下如果'b'
  • 因此,您的代码变成:

    for item in l:
        if 'b' in item:
            del item['b']
    
    您还需要注意的一点是,在调用del的第一次迭代中,实际上您将删除所有需要的内容,因为d1是可变的。您需要认为d1是一个引用,而不是值(有点像C中的指针)


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

    您确实意识到[d1、d2、d1、d2、d1、d2]包含对两个dict的引用,而不是副本,对吗?i、 e.在这个例子中,你可以用del d1['b']替换for循环,它会产生同样的效果。+1,到目前为止,最好的方法是使用正确的循环,避免其他答案中的双重索引(首先检查成员资格,然后删除),这是原始问题。我担心使用“pop”,但它是有意义的,因为双重索引,谢谢-1用于使用列表理解其副作用+1有关dicts副本的警告。总分:0哦,我说过我不喜欢,但你可以。:)谢谢你的反馈,直到现在我才明白(或记得)