python - 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'}}
任何人都知道整理这段代码,如果我做错了什么,请纠正我。
等待您的友好回应。
解决方案
问题是这一行:
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]1
和3[0]10
,则在查找前者时,您将匹配后者的键。
推荐阅读
- python - Changing the value of pixel in an image
- android - Flutter 无法使用 ProGuard 构建 APK
- react-native - Unable to remove bottom border of TextInput in react native
- spring - Left Join Fetch 表现得像 Inner Join
- python - 如何优化 MoviePy 以实现快速渲染?
- c# - How to stop my character going off-screen?
- c# - C# Linq-to-Entities OrderByDescending isn't working
- proxy - 查尔斯代理冻结
- ios - 有没有办法捏和缩放以编程方式添加的图像?
- reactjs - 尝试导入错误:“react-lifecycles-compat”不包含默认导出(导入为“reactLifecyclesCompat”)