我有一个嵌套字典和列表的列表。我想要创建一个新的父类(
期望的输出应该是这样的:
现在,由于我的字典大小和深度可能会不同,我需要一个程序化的解决方案。因此,我想创建一个递归函数,遍历直到达到树的末尾。当函数到达特定分支的末尾时,它将在键(
有关如何解决这个问题的建议吗?非常感谢。
根据@running.t的建议,我尝试使用dict.pop方法。然而,由于它发生在迭代中,它会弹出旧键,创建并插入新键,但在下一次迭代中将获取刚刚创建的新键,弹出它,并创建并插入一个新的新键,依此类推(虽然它也不会进入无限循环)。
以下是一个简化的示例,以说明问题:
第1步:创建新的顶级dict
L0
)叫做'food'
,并将fruit
和vegs
中所有值向下移动一步(这样'L0': 'fruit'
就变成了'L1': 'fruit'
, 'L1': 'banana'
变成了'L2': 'banana'
,以此类推)。D = [{
"L0": "fruit",
"L1_list": [
{
"L1": "banana"
},
{
"L1": "apple",
"L2_list": [
{
"L2": "Green apple"
},
{
"L2": "Red apple"
}
]
},
{
"L1": "kiwi"
}
]
},
{
"L0": "vegs",
"L1_list": [
{
"L1": "potato"
},
{
"L1": "carrot"
}
]
}]
期望的输出应该是这样的:
Expected_output = [
{
"L0": "food",
"L1_list": [
{
"L1": "fruit",
"L2_list": [
{
"L2": "banana"
},
{
"L2": "apple",
"L3_list": [
{
"L3": "Green apple"
},
{
"L3": "Redapple"
}
]
},
{
"L2": "kiwi"
}
]
},
{
"L1": "vegs",
"L2_list": [
{
"L2": "potato"
},
{
"L2": "carrot"
}
]
}
]
}
]
现在,由于我的字典大小和深度可能会不同,我需要一个程序化的解决方案。因此,我想创建一个递归函数,遍历直到达到树的末尾。当函数到达特定分支的末尾时,它将在键(
L0
--> L1
,L1_list
--> L2_list
)中添加1。虽然这个过程确实将所有内容向下移动了一级,但我无法弄清如何重建初始结构。特别是,我无法将子项带回其各自的列表中。Final_list = []
def digger(list_to_dig):
import re
for x in list_to_dig:
for k,v in x.items():
if isinstance(v, list):
print("keep digging")
digger(v)
elif isinstance(x, dict):
new_D = {}
new_k = "L" + str(int(re.sub("L", "", k)) + 1)
new_D[new_k] = v
temp = re.sub("L", "", k)
new_child_list = "L" + str(int(re.sub("_list", "", temp)) + 2) + "_list"
new_D[new_child_list] = ""
Final_list.append(new_D)
else:
print("no dictionary avail")
pass
print("_________")
print(Final_list)
print("_________")
test = digger(D)
有关如何解决这个问题的建议吗?非常感谢。
根据@running.t的建议,我尝试使用dict.pop方法。然而,由于它发生在迭代中,它会弹出旧键,创建并插入新键,但在下一次迭代中将获取刚刚创建的新键,弹出它,并创建并插入一个新的新键,依此类推(虽然它也不会进入无限循环)。
以下是一个简化的示例,以说明问题:
第1步:创建新的顶级dict
new_top_level = {"L0": "Food"}
new_dict = {}
for k, v in new_top_level.items():
lst_k = "L" + str(int(re.sub("L", "", ka)) + 1) + "_list"
new_dict[k] = v
new_dict[lst_k] = []
步骤2:将旧树添加到新列表中
old_d = {'L0': 'Fruit', 'L1_list': [{'L1': 'Green apple'}, {'L1': 'Red apple'}]}
new_dict[lst_k].append(old_d)
步骤三:将旧树的所有键值增加1
def digger(list_to_update):
import re
pattern1 = r"L.$"
pattern2 = r"L._list"
for x in list_to_update:
for k1, v1 in x.items():
if re.match(pattern1, k1):
new_k1 = "L" + str(int(re.sub("L", "", k1)) + 1)
x[new_k1] = x.pop(k1)
elif re.match(pattern2, k1):
temp = re.sub("L", "", k1)
new_k1 = "L" + str(int(re.sub("_list", "", temp)) + 1) + "_list"
x[new_k1] = x.pop(k1)
digger(v1)
test = digger(new_dict[lst_k])
L10
是什么情况? - Mad Physicist