【问题标题】:Split String Based on Enclosed Brackets [duplicate]基于封闭括号拆分字符串[重复]
【发布时间】:2017-01-03 20:57:40
【问题描述】:

对于我正在开发的程序,我有一个包含类似于以下内容的文本文件:

{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}

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

【问题讨论】:

  • ast.literal_eval

标签: python string python-3.x


【解决方案1】:

你很幸运(或者真的很幸运?),你的格式是有效的 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

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2020-07-03
    • 2017-08-24
    相关资源
    最近更新 更多