循环遍历python变量
我有一个变量可以如下所示:循环遍历python变量,python,Python,我有一个变量可以如下所示: ('[{"path": ["$.parent_field.field_1"], "category": "A"}, {"path": ["$.field_2"], "category": "B"}, {"path": ["$.null_path"], "cate
('[{"path": ["$.parent_field.field_1"], "category": "A"}, {"path": ["$.field_2"], "category": "B"}, {"path": ["$.null_path"], "category": "C"}]',)
本质上,我在寻找“循环”变量的最佳方法
我想要的结果是:
parent_field.field_1 and field_2
因此,我基本上希望提取路径字段(在$.
之后),除非它是null\u path
我尝试过(其中p等于变量):
但这让我觉得我是:
[{"path": ["$.parent_field.field_1"], "category": "A"}, {"path": ["$.field_2"], "category": "B"}, {"path": ["$.null_path"], "category": "C"}]
然后我就不能像希望的那样循环使用I了这里有一种方法可以在while循环中完成,并在每次迭代时替换旧字符串:
s = '[{"path": ["$.parent_field.field_1"], "category": "A"}, {"path": ["$.field_2"], "category": "B"}, {"path": ["$.null_path"], "category": "C"}]'
while True:
start = s.find('["$.')+4
end = s.find('"]')
if start>0 and end>0:
print(s[start:end])
s = s[end+1:]
else:
break
为您提供以下打印输出:
parent_field.field_1
field_2
null_path
-----编辑------
如果变量s
的结构如下所示,则更好的方法可能是这样做:
s = ('[{"path": ["$.parent_field.field_1"], "category": "A"}', '{"path": ["$.field_2"], "category": "B"}', '{"path": ["$.null_path"], "category": "C"}]')
for sub_s in s:
start = sub_s.find('["$.')+4
end = sub_s.find('"]')
if start>0 and end>0:
print(sub_s[start:end])
首先给出完全相同的打印输出,您需要将
json
字符串转换为dict
,然后找到相应的条目:
import json
result = json.loads(p[0]) ### it's a single-element tuple
paths = []
for pathdict in result:
paths.append(pathdict['path'][0]) ## single-element lists
print(path)
给
['$.parent_field.field_1', '$.field_2', '$.null_path']
如果您实际需要的不仅仅是
'path'
元素,您可以通过各种方式在pathdict
上循环。这真的是您的变量吗?它是python dict的python列表的python元组的字符串表示,这看起来很奇怪。你是怎么得到它的?我使用的是psycopg2,它是从DB上的select语句返回的,所以psycopg2将外括号放在它上面,我认为真正的问题不是外括号,而是外引号。您需要的是dict的实际列表:[{…},{…}]
,而不是它的字符串版本。你可以通过eval
获得,但我怀疑还有更直接的方法。(我对psycopg2一无所知。)字符串值是有效的json。所以只需执行json.loads(i)
。啊,所以它是json
而不是dict
。这是有道理的。Thx,@ekhumoro。字符串实际上是一个dictsHeh列表。但是你的json.loads
建议仍然有效,这就足够像json了……好吧,这就是json。顶级项可以是列表或dict,也可以包含类似对象的任意组合。看见
['$.parent_field.field_1', '$.field_2', '$.null_path']