Python:当满足条件时,如何使用for循环删除和转换字典中某些项的形式
字典在上面,我想删除值为0的键,并将数组形式转换为float。想要的输出是: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
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}}}