提问人:lowkey 提问时间:8/16/2023 最后编辑:lowkey 更新时间:8/17/2023 访问量:57
处理 python 字典以删除不需要的元素并保留所需的元素
Process the python dictionary to remove undesired elements and retain desired ones
问:
我有一个python字典,如下所示:
ip = {
"doc1.pdf": {
"img1.png": ("FP", "text1"),
"img2.png": ("NP", "text2"),
"img3.png": ("FP", "text3"),
},
"doc2.pdf": {
"img1.png": ("FP", "text4"),
"img2.png": ("NP", "text5"),
"img3.png": ("NP", "text6"),
"img4.png": ("NP", "text7"),
"img5.png": ("Others", "text8"),
"img6.png": ("FP", "text9"),
"img7.png": ("NP", "text10"),
},
"doc3.pdf": {
"img1.png": ("Others", "text8"),
"img2.png": ("FP", "text9"),
"img3.png": ("Others", "text10"),
"img4.png": ("FP", "text11"),
},
"doc4.pdf": {
"img1.png": ("FP", "text12"),
"img2.png": ("Others", "text13"),
"img3.png": ("Others", "text14"),
"img4.png": ("Others", "text15"),
},
"doc5.pdf": {
"img1.png": ("FP", "text16"),
"img2.png": ("FP", "text17"),
"img3.png": ("NP", "text18"),
"img4.png": ("NP", "text19"),
},
}
这里的关键字表示 、 是 和 是(它不是 或 的一部分)。所以 和 是连续的,因此会出现在 之前。现在我想将顺序的 's 与其他顺序的 's 和 's 分开。FP
FirstPage
NP
NextPage
Others
OtherPage
FP
NP
FP
NP
FP
NP
FP
NP
FP
NP
我想根据以下规则处理字典:
- 删除元组中包含关键字的所有元素。
Others
- 接下来,我想将这些元素组合成一个连续的字典,即连续的 's 和 's。因此,如果一个或多个 's 出现在 a 之后,则 和 应该合并到一个字典中。
FP
NP
NP
FP
FP
NP
- 如果有一个没有后面的孤独,或者如果一个 (1) 后面跟着另一个 (2),那么 (1) 需要放在一个单独的字典中。
FP
NP
FP
FP
FP
以下是上述输入的输出如下所示:
op = {
"doc1.pdf": [
{
"img1.png": ("FP", "text1"),
"img2.png": ("NP", "text2")
}
{
"img3.png": ("FP", "text3")
}
],
"doc2.pdf": [
{
"img1.png": ("FP", "text4"),
"img2.png": ("NP", "text5"),
"img3.png": ("NP", "text6"),
"img4.png": ("NP", "text7")
}
{
"img6.png": ("FP", "text9"),
"img7.png": ("NP", "text10")
}
],
"doc3.pdf": [
{
"img2.png": ("FP", "text9")
}
{
"img4.png": ("FP", "text11"),
}
],
"doc4.pdf": [
{
"img1.png": ("FP", "text12")
}
],
"doc5.pdf": [
{
"img1.png": ("FP", "text16")
}
{
"img2.png": ("FP", "text17"),
"img3.png": ("NP", "text18"),
"img4.png": ("NP", "text19")
}
]
}
到目前为止,我已经尝试过这个,但它不起作用:
def remove_others(ip_dict):
op_dict = {}
for doc, img_dict in ip_dict.items():
temp_list = []
current_group = []
for img, values in img_dict.items():
label, text = values
if label == "Others":
continue
if current_group and label == "NP" and current_group[-1][1][0] == "FP":
current_group.append((img, (label, text)))
else:
if current_group:
temp_list.append(dict(current_group))
current_group = [(img, (label, text))]
if current_group:
temp_list.append(dict(current_group))
op_dict[doc] = temp_list
return op_dict
任何帮助都是值得赞赏的!
答:
0赞
VoNWooDSoN
8/16/2023
#1
这似乎符合您的要求。
def split_on_FP(list_of_tuples):
result = []
interm = collections.OrderedDict()
for name,(k,v) in list_of_tuples:
if k == "FP" and len(interm) > 0:
result.append(interm)
interm = collections.OrderedDict()
interm.update({k:v})
if len(interm) > 0:
result.append(interm)
return result
print({ kd: split_on_FP((kx,vx) for kx,vx in doc.items() if "Others" not in vx) for kd,doc in ip.items() })
评论
0赞
Barmar
8/17/2023
正如在一些评论中提到的,字典现在是有序的,所以没有必要使用 OrderedDict,除非你需要与旧版本的 Python 兼容。
2赞
Barmar
8/16/2023
#2
每当您看到标签时,不要检查最后一个标签 ,而是启动一个新字典,并为其他标签添加键。temp_list
FP
def remove_others(ip_dict):
op_dict = {}
for doc, img_dict in ip_dict.items():
current_group = []
for img, (label, text) in img_dict.items():
if label == "Others":
continue
if label == "FP":
current_item = {img: (label, text)}
current_group.append(current_item)
else:
current_item[img] = (label, text)
op_dict[doc] = current_group
return op_dict
0赞
Andrej Kesely
8/17/2023
#3
另一种解决方案:
for k, v in ip.items():
out = []
for img, (pg, text) in v.items():
match pg:
case "FP":
out.append({img: (pg, text)})
case "NP":
out[-1][img] = (pg, text)
ip[k] = out
print(ip)
指纹:
{
"doc1.pdf": [
{"img1.png": ("FP", "text1"), "img2.png": ("NP", "text2")},
{"img3.png": ("FP", "text3")},
],
"doc2.pdf": [
{
"img1.png": ("FP", "text4"),
"img2.png": ("NP", "text5"),
"img3.png": ("NP", "text6"),
"img4.png": ("NP", "text7"),
},
{"img6.png": ("FP", "text9"), "img7.png": ("NP", "text10")},
],
"doc3.pdf": [{"img2.png": ("FP", "text9")}, {"img4.png": ("FP", "text11")}],
"doc4.pdf": [{"img1.png": ("FP", "text12")}],
"doc5.pdf": [
{"img1.png": ("FP", "text16")},
{
"img2.png": ("FP", "text17"),
"img3.png": ("NP", "text18"),
"img4.png": ("NP", "text19"),
},
],
}
评论
imgX.png
img4.png
doc2.pdf
current_group[-1][1][0] == "FP"
if current_group and label == "NP":