【问题标题】:How to remove dict keys if value is empty如果值为空,如何删除字典键
【发布时间】:2016-06-04 21:17:37
【问题描述】:

在我的表单发布请求中,我获取了所有表单信息,但似乎有一些空键和值。我想删除空键和值的所有实例。这是我到目前为止所拥有的,它显然不起作用。

post_dict = dict(request.POST)
item_data = {}

for key, value in post_dict.items():
    if value is None:
        del post_dict[key]
    field = key.split('[')[1].replace(']', '')
    item_data[field] = ''.join(value)

print(item_data)

打印 item_data 的样子:

{'': '', 'username': 'johndoe', 'email': 'johndoe@gmail.com', ... 

如果删除键,它会删除其各自的值吗?如何摆脱空键和值?

【问题讨论】:

  • 你的意思是if value == ''
  • if value is None 只会匹配精确的对象None。如果您只想删除 false-y 值(None''0[]...),请使用 if not value:
  • 你应该在删除后继续循环的下一次迭代。
  • @JETM 不,我也试过了.. 仍然显示空键和值
  • @Barmar 你是什么意思?

标签: python


【解决方案1】:

试试这个:

new_item_data={k:item_data[k] for k in item_data if item_data[k]}

任何没有值的键都将被删除。

【讨论】:

    【解决方案2】:

    也许您可以使用以下方法之一做您想做的事:

    dict_1 = {'': '', 'username': 'johndoe', 'email':'', }
    
    dict_2 = dict(x for x in dict_1.iteritems() if any(x))
    print dict_2  # {'username': 'johndoe', 'email': ''}
    
    dict_3 = dict(x for x in dict_1.iteritems() if all(x))
    print dict_3  # {'username': 'johndoe'}
    

    【讨论】:

      【解决方案3】:
      for key, value in post_dict.items():
      

      在您的代码中,您正在迭代post_dict。 但是,在del post_dict[key] 行中,您正在修改迭代器,因此它将提供与for 不一致的字典视图。向您正在迭代的字典添加或删除键是不好的。

      这可能会给你想要的结果

      post_dict = dict(request.POST)
      item_data = {}
      
      for key, value in post_dict.items():
          if value == "":
              continue
          if key == "":
              continue
          field = key.split('[')[1].replace(']', '')
          item_data[field] = ''.join(value)
      
      print(item_data)
      

      【讨论】:

      • 我确定 items() 调用将返回项目列表的副本,这意味着从原始字典中删除实际上不会影响迭代......除非你是正确的!我刚刚写了一个简单的测试,它肯定会修改你正在迭代的字典 +1
      • 有什么理由会抛出 IndexError: list index out of range :\ ?
      【解决方案4】:

      试试这个,

      post_dict = {'': '', 'item_data[username]': ['johndoe'], 'item_data[email]': ['johndoe@gmail.com'], 'item_data[campus]': ['madison']}
      item_data = {}
      
      for key, value in post_dict.items():
          strlist = key.split('[')
          if len(strlist) == 1:
              continue
      
          new_key = strlist[1].replace(']', '')
          new_value = ''.join(value)
      
          # add to the dict if both new_key and new_value are non-empty
          if all([new_key, new_value]):
              item_data[new_key] = new_value
      
      print(item_data)
      # Output
      {'username': 'johndoe', 'campus': 'madison', 'email': 'johndoe@gmail.com'}
      

      上一个答案:从键或值为空的字典中删除那些项目。

      d = {'': '', 'username': 'johndoe', 'email': 'johndoe@gmail.com'}
      
      for k, v in d.items():
          if not any([k, v]):
              del d[k]
      
      print(d)
      {'username': 'johndoe', 'email': 'johndoe@gmail.com'}
      

      【讨论】:

      • 顶部抛出:IndexError: list index out of range
      • @Modelesq,post_dict的内容是什么?
      • {'item_data[username]': ['johndoe'], 'item_data[email]': ['johndoe@gmail.com'], 'item_data[campus]': ['madison'],... 等等
      • @Modelesq,您的数据可能包含'':''。我编辑了我的答案。请再次检查。
      • 是的!你真棒。谢谢!
      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多