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

时间:2017-01-03 20:57:41

标签: python string python-3.x

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

{0: {2: 1, 1: 1}, 1: {2: 1, 0: 1}, 2: {0: 1, 1: 1}}

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

0:
{2: 1, 1: 1}
1:
{2: 1, 0: 1}

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

1 个答案:

答案 0 :(得分: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))

结果:

0
{1: 1, 2: 1}
1
{0: 1, 2: 1}
2
{0: 1, 1: 1}

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

更一般地说,如果您有其他分隔符,因此它不适合ast.literal_evaljson,则可以使用名为pyparsing的嵌套功能解析器模块。