【问题标题】:Remove keys from a dictionary which has "nan" values从具有“nan”值的字典中删除键
【发布时间】:2021-06-07 16:02:28
【问题描述】:

我有源字典,请参考下面的示例。它有深层嵌套的子字典和列表,我需要删除值为“nan”的所有键。

data = {"col1":"val1","col2":"val2","col3":"val3","col4":"val3","list1":[{"l1":"v1","l2":"nan"},{"K1":"Kv1","K2":"nan"},{"M1":"Mv1","M2":"nan","sublist1":[{"SL1":"SV1","SL2":"nan"}]}],"list2":[{"l1":"v1","l2":"nan"},{"K1":"Kv1","K2":"nan"},{"M1":"Mv1","M2":"nan","sublist2":[{"SL1":"SV1","SL2":"nan"}]}]}

我通过创建函数尝试了以下代码,但它没有按预期工作:

def cleanNullTerms(d): 
   clean = {}
   for k, v in d.items():
      if isinstance(v, list):
         for values in v:
            nested = cleanNullTerms(values)
            if values =='nan':
                clean[k] = nested
      elif v is not 'nan':
         clean[k] = v
   return clean

【问题讨论】:

标签: python


【解决方案1】:

您没有准确描述出了什么问题,但从检查来看,您的函数在我看来显然是错误的,因为它不检查嵌套的 dicts。您也没有说明您的预期输出是什么,但以下内容对我来说是正确的。

from pprint import pprint, pp


def cleanNullTerms(d):
    clean = {}
    for k, v in d.items():
        if isinstance(v, dict):
            clean[k] = cleanNullTerms(v)
        elif isinstance(v, list):
            clean[k] = [cleanNullTerms(values) for values in v]
        elif v != 'nan':
            clean[k] = v
    return clean


data = {'col1': 'val1',
        'col2': 'val2',
        'col3': 'val3',
        'col4': 'val3',
        'list1': [{'l1': 'v1', 'l2': 'nan'},
                  {'K1': 'Kv1', 'K2': 'nan'},
                  {'M1': 'Mv1',
                   'M2': 'nan',
                   'sublist1': [{'SL1': 'SV1', 'SL2': 'nan'}]}],
        'list2': [{'l1': 'v1', 'l2': 'nan'},
                  {'K1': 'Kv1', 'K2': 'nan'},
                  {'M1': 'Mv1',
                   'M2': 'nan',
                   'sublist2': [{'SL1': 'SV1', 'SL2': 'nan'}]}]}

data = cleanNullTerms(data)
pprint(data, sort_dicts=False)

打印结果:

{'col1': 'val1',
 'col2': 'val2',
 'col3': 'val3',
 'col4': 'val3',
 'list1': [{'l1': 'v1'},
           {'K1': 'Kv1'},
           {'M1': 'Mv1', 'sublist1': [{'SL1': 'SV1'}]}],
 'list2': [{'l1': 'v1'},
           {'K1': 'Kv1'},
           {'M1': 'Mv1', 'sublist2': [{'SL1': 'SV1'}]}]}
 

【讨论】:

    【解决方案2】:

    您的代码将列表的值放在列表所在的位置。如果有很多值,每个值都会覆盖最后一个,所以只有最后一个被保存。它并没有被卷入字典。如果它们与字典和列表嵌套,它仍然只删除“nan”。例如,它不进入集合。如果你想让它进入集合,写评论,我可以添加这个。

    def cleanNullTerms(d):
       clean={}
       for k, v in d.items():
          if isinstance(v, list):
             v2=[]
             for value0 in v:
                nested=cleanNullTerms(value0)
                if value0!='nan':
                    v2.append(nested)
             clean[k]=v2
          elif isinstance(v, dict):
              clean[k]=cleanNullTerms(v)
          elif v!='nan':
             clean[k]=v
       return clean
    

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 2018-12-04
      • 2020-03-11
      • 2022-01-23
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多