【发布时间】:2018-09-21 07:17:36
【问题描述】:
我有以下嵌套字典和列表列表。我想创建一个名为 'food' 的新父 (L0) 类别,并将 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"
}
]
}
]
}
]
现在,由于我的字典的大小和深度不同,我需要一个程序化解决方案。所以我想我会创建一个递归函数来迭代 util 它到达树的末尾。当函数到达特定分支的末尾时,它会将 1 添加到键(L0 --> L1、L1_list --> L2_list)。尽管该过程确实将所有内容都降低了一级,但我不知道如何重建初始结构。特别是,我不能让孩子们回到他们各自的名单中。
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 方法。但是,因为它发生在迭代中,它会弹出旧密钥,创建并插入新密钥,但在下一次迭代中,将采用刚刚创建的新密钥,弹出它,然后创建并插入一个新的新密钥,等等on(虽然它也没有进入无限循环)。
这里有一个简化的例子来说明问题:
第 1 步创建新的顶级字典
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)
第 3 步将老树的所有键加 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])
【问题讨论】:
-
你从哪里得到最初的字典?你自己建的吗?
-
是的,我手动构建了那个特定的字典。但在最终解决方案中,它将由最终用户通过 UI 构建
-
L10呢?
标签: python dictionary