Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:当满足条件时,如何使用for循环删除和转换字典中某些项的形式_Python_Loops_Dictionary_For Loop - Fatal编程技术网

Python:当满足条件时,如何使用for循环删除和转换字典中某些项的形式

Python:当满足条件时,如何使用for循环删除和转换字典中某些项的形式,python,loops,dictionary,for-loop,Python,Loops,Dictionary,For Loop,字典在上面,我想删除值为0的键,并将数组形式转换为float。想要的输出是: d = {0: {0: {0: 0, 1: 0}, 1: {0: 0, 2: np.array([ 0.02981036])}}, 9: {0: {0: 0, 1: 0}, 7: {0: 0, 4: np.array([ 0.01502996]), 9: 0}, 8: {0: 0

字典在上面,我想删除值为0的键,并将数组形式转换为float。想要的输出是:

d = {0: {0: {0: 0, 1: 0},
         1: {0: 0,
             2: np.array([ 0.02981036])}},
     9: {0: {0: 0, 1: 0},
         7: {0: 0,
             4: np.array([ 0.01502996]),
             9: 0},
         8: {0: 0,
             1: 0},
         9: {0: 0, 1: 0}}}
我尝试使用for循环删除0项,但始终得到keyrerror:0。我是python的新手,请帮我上船。谢谢

这里的是dict或dict of dict。使用json可能是个好主意。但这里有一个解决方案的草稿版本

另外,由于您试图在不同级别上迭代键时删除键,因此可能会遇到RuntimeError问题。为此,我们将需要深度复制dict,重复原始内容并从副本中删除

源代码

递归解决方案:

import numpy as np
import copy

d = {0: {0: {0: 0, 1: 0},
         1: {0: 0,
             2: np.array([ 0.02981036])}},
     9: {0: {0: 0, 1: 0},
         7: {0: 0,
             4: np.array([ 0.01502996]),
             9: 0},
         8: {0: 0,
             1: 0},
         9: {0: 0, 1: 0}}}

d2 = copy.deepcopy(d)
for k1,v1 in d.iteritems():    
    for k2,v2 in v1.iteritems():
        for k3,v3 in v2.iteritems():
            #print k1,k2,k3,v3
            if v3 == 0:
                d2[k1][k2].pop(k3)
            if type(v3) is np.ndarray:
                v3 = v3.tolist()
                d2[k1][k2][k3] = float(''.join(str(i) for i in v3))

        if len(d2[k1][k2]) == 0:
            d2[k1].pop(k2)

 >>> d2
{0: {1: {2: 0.02981036}}, 9: {7: {4: 0.01502996}}}

您可以尝试删除值为0的所有零:

import numpy

def clean(d):
    new = {}
    for k, v in d.items():
        if v == 0:
            pass
        elif isinstance(v, numpy.ndarray):
            new_element = float(v[0])
            new[k] = new_element
        else:
            new_element = clean(v)

            if new_element != {}:
                new[k] = new_element

    return new
输出:

import numpy as np
from copy import deepcopy

d = {0: {0: {0: 0, 1: 0},
         1: {0: 0,
             2: np.array([ 0.02981036])}},
     9: {0: {0: 0, 1: 0},
         7: {0: 0,
             4: np.array([ 0.01502996]),
             9: 0},
         8: {0: 0,
             1: 0},
         9: {0: 0, 1: 0}}}

deep_copy=deepcopy(d)
for key,value in d.items():
    for key1,value1 in value.items():
        for key2,value2 in value1.items():
            if value2==0:
                del deep_copy[key][key1][key2]






new_deep_copy=deepcopy(deep_copy)
for key,value in deep_copy.items():
    for key1,value1 in value.items():
        for key2,value2 in value1.items():
            if isinstance(value2,np.ndarray):
                new_deep_copy[key][key1][key2]=float(value2)


        if value1=={}:
            del new_deep_copy[key][key1]


print(new_deep_copy)

请向我们展示您得到的keyrorror的代码这是可行的,但它非常昂贵,您可以用递归替换这些循环注意,在Python3中dict.iteritems已被dict.items替换。我理解。OP.对时间/空间复杂性没有限制,我使用的是2.7,因此dict.iteritems。正如我提到的,这是一次抓挠/偷懒的尝试。
import numpy

def clean(d):
    new = {}
    for k, v in d.items():
        if v == 0:
            pass
        elif isinstance(v, numpy.ndarray):
            new_element = float(v[0])
            new[k] = new_element
        else:
            new_element = clean(v)

            if new_element != {}:
                new[k] = new_element

    return new
import numpy as np
from copy import deepcopy

d = {0: {0: {0: 0, 1: 0},
         1: {0: 0,
             2: np.array([ 0.02981036])}},
     9: {0: {0: 0, 1: 0},
         7: {0: 0,
             4: np.array([ 0.01502996]),
             9: 0},
         8: {0: 0,
             1: 0},
         9: {0: 0, 1: 0}}}

deep_copy=deepcopy(d)
for key,value in d.items():
    for key1,value1 in value.items():
        for key2,value2 in value1.items():
            if value2==0:
                del deep_copy[key][key1][key2]






new_deep_copy=deepcopy(deep_copy)
for key,value in deep_copy.items():
    for key1,value1 in value.items():
        for key2,value2 in value1.items():
            if isinstance(value2,np.ndarray):
                new_deep_copy[key][key1][key2]=float(value2)


        if value1=={}:
            del new_deep_copy[key][key1]


print(new_deep_copy)
{0: {1: {2: 36.0}}, 9: {7: {4: 0.01502996}}}