首页 > 解决方案 > python代码循环没有按照要求迭代

问题描述

我正在尝试从 json 文件中以特定格式迭代值,但似乎在迭代过程中循环被破坏了。

我的示例 python 代码是

import json
import re
from pprint import pprint

fields = {}
out = []

with open('test.json', 'r') as f:
    msg = json.load(f)

    for segments in msg["parsedData"]["segments"]:
        if "PID" in segments["segmentId"]:
            seg = segments["fields"]
            for i in seg.keys():
                f = re.search(r"([0-9]+)\[", i)
                index = re.search(r"\[([0-9]+)\]", i)
                l = re.search(r"\]([0-9.]+)", i)
                if f is not None and index is not None and l is not None:
                    f = f.group(1)
                    i = index.group(1)
                    l = l.group(1)

                    fields[ f + l ] = {}
                    for x in filter(lambda x: x.startswith(f"{f}[{i}]{l}"), seg.keys()):
                        fields[ f + l ][ i ] = seg[ x ]

pprint(fields)

我的 json 文件(test.json)

{  "parsedData": {
      "segments": [
        {
          "segmentId": "PID",
          "fields": {
            "5.1": "EGHFG",
            "7": "19680808",
            "3[0].1": "working1",
            "3[1].1": "working2",
            "3[1].5": "test2",
            "5.2": "DFSHY",
            "18": "280156074",
            "3[1].4": "WR",
            "3[0].5": "test1",
            "4[0].5": "HAI",
            "0": "PID"
                   }
                 }
      ]
         }
}

我正在尝试打印如下所示的输出

{'3.1': {'0':'working1','1':'working2'},
'3.4': {'1': 'WR'},
'3.5': {'0': 'test1','1': 'test2'},
'4.5': {'0': 'EPI'}}

任何人都知道整理这段代码,如果我做错了什么,请纠正我。

等待您的友好回应。

标签: python

解决方案


问题是这一行:

fields[ f + l ] = {}

reinitializes fields[f+l],因此您会丢失在先前迭代中分配的值。

您可以更改它以检查元素是否已存在:

if f+l not in fields:
    fields[ f + l ] = {}

或者您可以使用defaultdict

field = defaultdict(dict)
import re
from pprint import pprint
from collections import defaultdict

msg = {
    "parsedData": {
        "segments": [
            {
                "segmentId": "PID",
                "fields": {
                    "5.1": "EGHFG",
                    "7": "19680808",
                    "3[0].1": "working1",
                    "3[1].1": "working2",
                    "3[1].5": "test2",
                    "5.2": "DFSHY",
                    "18": "280156074",
                    "3[1].4": "WR",
                    "3[0].5": "test1",
                    "4[0].5": "HAI",
                    "0": "PID"
                    }
                }
            ]
        }
    }

fields = defaultdict(dict)

for segments in msg["parsedData"]["segments"]:
    if "PID" in segments["segmentId"]:
        seg = segments["fields"]
        for i in seg.keys():
            f = re.search(r"([0-9]+)\[", i)
            index = re.search(r"\[([0-9]+)\]", i)
            l = re.search(r"\]([0-9.]+)", i)
            if f is not None and index is not None and l is not None:
                f = f.group(1)
                i = index.group(1)
                l = l.group(1)

                for x in filter(lambda x: x.startswith(f"{f}[{i}]{l}"), seg.keys()):
                    fields[ f + l ][ i ] = seg[ x ]

pprint(dict(fields))

顺便说一句,x.startswith(f"{f}[{i}]{l}")这似乎是一张糟糕的支票。如果您有键3[0]13[0]10,则在查找前者时,您将匹配后者的键。


推荐阅读