处理 python 字典以删除不需要的元素并保留所需的元素

Process the python dictionary to remove undesired elements and retain desired ones

提问人:lowkey 提问时间:8/16/2023 最后编辑:lowkey 更新时间:8/17/2023 访问量:57

问:

我有一个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 分开。FPFirstPageNPNextPageOthersOtherPageFPNPFPNPFPNPFPNPFPNP

我想根据以下规则处理字典:

  1. 删除元组中包含关键字的所有元素。Others
  2. 接下来,我想将这些元素组合成一个连续的字典,即连续的 's 和 's。因此,如果一个或多个 's 出现在 a 之后,则 和 应该合并到一个字典中。FPNPNPFPFPNP
  3. 如果有一个没有后面的孤独,或者如果一个 (1) 后面跟着另一个 (2),那么 (1) 需要放在一个单独的字典中。FPNPFPFPFP

以下是上述输入的输出如下所示:

    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

任何帮助都是值得赞赏的!

python-3.x 字典 处理 数据 -munging

评论

0赞 VoNWooDSoN 8/16/2023
我正在调查这个问题,但我立即收到关于订购的坏消息。因为 python 字典是哈希表,这意味着你不能依赖它们来按顺序排列。我认为,由于你的字典的性质,你打算按数字 X 排序,但你的 python 字典不会为你保持这个顺序。您可以使用集合。不过,OrderedDict...我会看看我能不能想出一个例子imgX.png
2赞 spectre 8/16/2023
从 python 3.8 开始订购字典
0赞 slothrop 8/16/2023
从 Python 3.7 开始,Python 字典确实保留了它们的插入顺序(即在当前支持的每个版本中):stackoverflow.com/questions/39980323/...
1赞 slothrop 8/16/2023
输入无效:键在 的内部字典中重复。(嗯,这是合法的 Python,但除了最后一个带有该键的条目之外,其他所有条目都不会生效。img4.pngdoc2.pdf
1赞 slothrop 8/16/2023
@lowkey基本问题是检查.这意味着只有当字典中的最后一个元素是 FP 时,才能附加 NP。因此,序列 FP-NP 有效,但 FP-NP-NP 不起作用:如果最后一个元素也是 NP,则代码不会附加另一个 NP。如果您刚刚删除了该支票怎么办?看起来应该足以确保 NP 附加到当前组(如果存在)。current_group[-1][1][0] == "FP"if current_group and label == "NP":

答:

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_listFP

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"),
        },
    ],
}