基于封闭括号的拆分字符串

Rip*_*pIt 0 python string python-3.x

对于我正在处理的程序,我有一个包含类似于此的文本文件:

{0: {2: 1, 1: 1}, 1: {2: 1, 0: 1}, 2: {0: 1, 1: 1}}
Run Code Online (Sandbox Code Playgroud)

其中第一个数字是节点的索引,以下是此节点连接的后续节点列表及其权重.我想知道最好的方法是能够抓住一对{}中包含的单个集合,所以我最终会得到这样的结果:

0:
{2: 1, 1: 1}
1:
{2: 1, 0: 1}
Run Code Online (Sandbox Code Playgroud)

目前我的计划是找到第一个冒号的索引,并将open括号和冒号之间的内容作为ID,然后找到下一个打开的括号并跟随冒号获取以下一组节点,但它很快变得复杂更大的列表,并想知道是否有更好的方法

Jea*_*bre 6

你运气好(或者真的好运吗?),你的格式是有效的python文字词典.

所以你必须:

  • ast.literal_eval做繁重的任务和创建类型的字典词典
  • 迭代已排序的项目并根据您想要的格式进行打印(请注意,内部词典的排序是任意的,如果您想控制它,则必须再次对已排序的元素进行另一个循环)

码:

import ast

s = "{0: {2: 1, 1: 1}, 1: {2: 1, 0: 1}, 2: {0: 1, 1: 1}}"
dict_of_dicts = ast.literal_eval(s)
for k,v in sorted(dict_of_dicts.items()):
    print("{}\n{}".format(k,v))
Run Code Online (Sandbox Code Playgroud)

结果:

0
{1: 1, 2: 1}
1
{0: 1, 2: 1}
2
{0: 1, 1: 1}
Run Code Online (Sandbox Code Playgroud)

请注意,json.loads这在此处不起作用,因为json数据集中需要双引号字符串.其他数据类型不兼容.

更一般地说,如果你有其他分隔符,因此它不适合ast.literal_eval或者json,有一个支持嵌套的解析器模块pyparsing.