代码之家  ›  专栏  ›  技术社区  ›  igorgue

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

  •  0
  • igorgue  · 技术社区  · 15 年前

    我正试图根据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 回复  |  直到 13 年前
        1
  •  16
  •   Danra Bathsheba    15 年前
    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
    
        2
  •  3
  •   Kathy Van Stone    15 年前

    稍微简化一下:

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

    有些人可能也会这样做

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

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

        3
  •  2
  •   Lennart Regebro    15 年前

    我喜欢你的方法(除了你使用循环变量,但是其他人已经指出了),它是不易理解的。如果您想要尽量减少键入的内容,则此操作有效:

    [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键。

        4
  •  0
  •   Nikokrock    15 年前

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

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

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

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

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

    因此,您的代码变成:

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

    正如Lennart Regebro提到的优化代码,您还可以使用列表理解。