【问题标题】:Why is this code to delete negative values from a dictionary not working?从字典中删除条目(Python)
【发布时间】:2013-12-23 12:09:08
【问题描述】:

好的,所以我必须删除所有具有负值的条目。我不明白为什么我的代码不起作用。

def main():
dic = {'aa': 20, 'bb': -10, 'cc': -12}
for i in dic:
    if dic[i]<0:
        del dic[i]

print(dic)

main() 

【问题讨论】:

  • 您不能删除此循环中的条目。您可以将它们存储到列表或其他内容中。
  • 但这如何帮助我摆脱字典中的那些条目?

标签: python-3.x dictionary


【解决方案1】:

这应该在 Python 2.x 中工作 - 用 for 循环替换

 for i in dic.keys():
   if dic[i]<0:
    del dic[i]

这在 Python 3.x 中不起作用的原因是 keys 返回的是迭代器而不是列表——我在 https://stackoverflow.com/a/11941855/2314737 中找到了解释

相当微妙的区别——我不知道。

因此,在 Python 3.x 中,您需要使用

for i in list(dic):

【讨论】:

  • 你检查过你的缩进吗?
【解决方案2】:
delete_list = []
for i in dic:
    if dic[i] < 0:
        delete_list.append(i)
for each in delete_list:
    del dic[each]

【讨论】:

  • 欢迎。当您运行此列表的循环时,无法删除列表中的项目。
  • 在我看来,user2314737 使用list(dic) 的最后一行解决方案在可读性方面更简洁。如 Steinar Lina 所示,将想要的项目复制到另一个字典也很好,因为它只在字典中循环一次。我建议测量所有三种解决方案,以了解什么是最好的:)
【解决方案3】:

您可以通过使用字典推导来完成此操作。

dic = {k: v for (k, v) in dic.items() if v >= 0}

【讨论】:

  • +1 但应该是dic.items() 而不是dic.values()。此外,for (k, v) ... 中的 kv 周围不需要括号。
【解决方案4】:
d = {}
# ...

keys = list(d.keys())

for key in keys:
  if something_is_true:
    del d[key]

【讨论】:

    【解决方案5】:

    使用dict.pop():

    myDict = {'aa': 20, 'bb': -10, 'cc': -12}
    condition = []
    
    for x, y in myDict.items ():
        if y <  0:
            condition.append(x)
            
    [myDict.pop(x) for x in condition ]
    
    print(myDict)
    

    给予

    {'aa': 20}
    

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      相关资源
      最近更新 更多