【问题标题】:How to delete an empty string key from a dictionary in python? [duplicate]如何从python中的字典中删除一个空字符串键? [复制]
【发布时间】:2021-11-11 13:28:25
【问题描述】:

我在python 的字典中有以下数据。

我面临的问题是空字符串作为字典中的键和值。

data = {'id': '213', 'first_name': 'john', 'last_name': 'doe', '': ''}

我的目标是删除空字符串key 并创建一个没有它的新字典

所以我尝试了:

from copy import deepcopy


for x, y in data.items():
  if x == "":
    del data[x]

new_data = deepcopy(data)

print(new_data)

但由于某种原因,我收到以下错误

...
for x, y in data.items():
RuntimeError: dictionary changed size during iteration

我错过了什么吗?

【问题讨论】:

  • 为什么要使用循环? if "" in data: del data[""] - 完成。
  • 您因未阅读错误消息而遗漏了某些内容。当你删除一个字典元素时,你正在改变字典的大小,你在迭代它时不应该这样做。你可以直接说del data[""],不用循环。
  • 你为什么想要一本新字典而不是仅仅从你现有的字典中删除该项目?
  • @don'ttalkjustcode 伙计,我犯了一个错误,我猜我在 javascript 上花了太多时间

标签: python python-3.x dictionary


【解决方案1】:

由于您已经在创建深层副本,因此您可以通过简单地迭代键并使用 if 条件删除不必要的键来受益。

试试这个 -

new_dict = {k:v for k,v in data.items() if k!=''}
print(new_dict)
{'id': '213', 'first_name': 'john', 'last_name': 'doe'}

正如错误跟踪很清楚地提到的那样,以下代码中的错误原因是因为您在迭代过程中修改了字典。

for x, y in data.items():
  if x == "":
    del data[x]            #<----

相反,正如其他一些出色的答案 (@tituszban) 所提到的,您应该直接使用 del data['']

【讨论】:

  • 你也可以使用dict.pop。检查key 是否在dict 然后dict.pop(key)
  • 请注意,此解决方案仅删除副本 (new_dict) 中的空字符串,而不是原始字典 (data) 中的空字符串,而问题中的代码试图将其从两个列表中删除.所以原来的问题并没有真正解决。
  • 很明显,如果需要修改原件,那么dict必须保存在原件中。 OP 制作深拷贝是有原因的。
【解决方案2】:

您不能在迭代项目时删除它。但你为什么要?您确切地知道要删除的密钥:

del data[""]

这将修改data。如果您想保留原来的字典,并在没有密钥的情况下创建一个新字典,请参阅@Akshay Sehgal's answer

【讨论】:

    【解决方案3】:

    错误非常简单:在迭代字典时,您不能从字典(或一般的集合)中删除元素。

    更好的方法可能是将要删除的项目存储在其他地方,然后在迭代后将它们全部删除,而不是尝试在迭代本身中修改字典。

    特别是,对于你的情况,你可以简单地做这样的事情,如果它存在的话,它将从字典中删除键:

    del data[""]
    

    而不是遍历整个字典,因为根据定义,字典最多可以有任何键的一个条目。

    【讨论】:

      【解决方案4】:

      要扩展 hoodakaushal 答案,您可以尝试这样做

      from copy import deepcopy
      to_delete =[]
      
      for x, y in data.items():
        if x == "":
          to_delete.append(x)
          
      
      for key in to_delete:
          del data[key]
      
      new_data = deepcopy(data)
      
      print(new_data)
      

      【讨论】:

        【解决方案5】:

        如果想从字典中提取数据,也可以这样尝试。

        data = {'id': '213', 'first_name': 'john', 'last_name': 'doe', '': ''}
        new_dict = {}
            for i, j in data.items():
                if i != "": # check key if not empty add to new dictionary
                    new_dict.update({i:j})
        
        print(new_dict)
        

        【讨论】:

        • if i and j != "": 并没有做你认为的那样..
        猜你喜欢
        • 2016-07-07
        • 2020-02-10
        • 2019-09-17
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2012-11-19
        • 2022-08-08
        相关资源
        最近更新 更多