【问题标题】:Way to remove keys that have array of zeros as value删除具有零数组作为值的键的方法
【发布时间】:2018-12-04 08:31:57
【问题描述】:

我有如下嵌套的dict:

 u'dvlRaw':{
   u'diagnosticInfoUDP': { 
      u'clientConnected': array([0, 0, 0, 0, 0, 0, 0,0, 0,0], dtype=uint8),
      u'channel': array([1, 1, 1, ..., 1, 1, 1], dtype=uint32)
     }
 }

如何删除其中包含整个零数组的键值对。 零数组的位置可能不是恒定的,有时可能是 child_dictionary 的值,有时可能是 child_dictionary 的孩子的值。 是否有一种通用的方法可以删除它可能位于的任何 child_dictionary 中出现的零数组

【问题讨论】:

标签: python numpy dictionary


【解决方案1】:

使用numpy.any检查每个数组是否包含任何非零值:

import numpy as np

diagnosticInfoUDP = dictionary['dvlRaw']['diagnosticInfoUDP']
for key in list(diagnosticInfoUDP):
    if not np.any(diagnosticInfoUDP[key]):
        del diagnosticInfoUDP[key]

编辑:从任意嵌套字典中删除仅零数组的一般解决方案:

def clean_dict(dictionary):
    for key, value in list(dictionary.items()):
        if isinstance(value, np.ndarray) and not np.any(value):
            del dictionary[key]
        elif isinstance(value, dict):
            clean_dict(value)

【讨论】:

  • 这对我帮助很大。谢谢。但是在这种情况下,嵌套字典中的键名是已知的,如果我只知道父字典,即只有字典名称,并且我必须删除字典中零数组的值。注意:零数组可能出现在任何子字典中。
  • 我们至少可以假设所有的数组都嵌套在相同的深度(即 3)或者甚至不是吗?
  • 在我的情况下,深度不会保持不变。有时是 2,有时是 3 或 4
【解决方案2】:

这是一个非常基本的方法:

d = {'dvlRaw':{'diagnosticInfoUDP': {'clientConnected': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'channel': [1, 1, 1, 1, 1, 1]}}}


def all_zeroes(arr):
  return 0 in set(arr) and len(set(arr)) == 1

remove = []
for k, v in d['dvlRaw']['diagnosticInfoUDP'].items():
  if all_zeroes(v): remove.append(k) 

for k in remove:
  del d['dvlRaw']['diagnosticInfoUDP'][k]

print(d)
#=> {'dvlRaw': {'diagnosticInfoUDP': {'channel': [1, 1, 1, 1, 1, 1]}}}

【讨论】:

    【解决方案3】:

    对于您定义的精确结构,您可以使用带有np.ndarray.any 的字典推导:

    import numpy as np
    
    dct = {u'dvlRaw': {u'diagnosticInfoUDP': 
           {u'clientConnected': np.array([0, 0, 0, 0, 0, 0, 0,0, 0,0], dtype='uint8'),
            u'channel': np.array([1, 1, 1, 1, 1, 1, 1], dtype='uint32')}}}
    
    res = {u'dvlRaw': {u'diagnosticInfoUDP':
           {k: v for k, v in dct[u'dvlRaw'][u'diagnosticInfoUDP'].items() if v.any()}}}
    
    print(res)
    
    {'dvlRaw': {'diagnosticInfoUDP': {'channel': array([1, 1, 1, 1, 1, 1, 1], dtype=uint32)}}}
    

    【讨论】:

      【解决方案4】:

      您可以从现有的字典创建一个新的嵌套字典:

      bob = {"bob" : {"nob": np.zeros(10), "dob" : np.ones(10)}}
      
      bob2 = {k : {k2 : bob[k][k2] for k2 in bob[k].keys() if not (bob[k][k2] == 0).all()} for k in bob.keys()}
      

      在这个例子中,我的嵌套字典被命名为bob,我正在用它构建一个新的嵌套字典,方法如下:

      • 对于bob 中的每个键k,构建新字典。
      • 如果bob[k][k2] 不是全零,则新字典将仅包含来自bob[k] 的键k2

      请注意,我正在对来自 bob k 的键以及每个内部字典的键进行迭代,在其键“k2”上,我正在使用键来提取值。

      【讨论】:

        猜你喜欢
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 2014-02-27
        • 2021-08-06
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多