【问题标题】:Converting information from string to dict将信息从字符串转换为字典
【发布时间】:2017-03-01 20:40:30
【问题描述】:

我有一个这样的字符串:

COLUMN 1:
    A:                         10.68
    B:                         11.82
    C:                         12.93
    D:                         50.2
C 2:
    Z:                         68
    S:                         182
    W:                         13
    E:                         50    

在字典等数据结构中保存这些信息的好方法是什么?

更新:问题是,在我的实际文本中,标题不一定以 COLUMN 开头,并且每个标题下的元素数量可能彼此不同。唯一不同的元素是在每个标题下,元素缩进了 4 个空格。

【问题讨论】:

  • 我不明白。你能举一个你想转换的字符串的具体例子吗?
  • 嵌套字典可以像 {1: {'A': 10.68, 'B': 11.82}, 2: {'Z': 68, 'S': 182}} 一样使用。像 column[1]['A'] 一样访问它。
  • @Tristan 是的,这似乎是一个非常有用的结构。
  • @Tristan 您应该将此作为答案而不是评论。
  • Stack Overflow 不是代码编写服务。请查看How to Ask 并向我们展示您尝试解决问题的方法。

标签: python python-3.x dictionary text


【解决方案1】:

灵感来自@Vor 的回答。

result, root = {}, None

for i in q.split('\n'):
    if i.strip().endswith(':'):
        root = i.strip()
        result[root] = {}
    elif i:
        val = list(map(lambda x: x.strip(), i.split(':')))
        result[root].update({val[0]: val[1]})

print(result)

遵守规则:

  • 标题以: 结尾
  • 项目分隔符为:
  • 没有空行

变化在于您可以将每个根键 Column X 存储在 var 中,并检查此根键上方的所有行,然后迭代和更新此键。

【讨论】:

    【解决方案2】:

    你可以像这样创建嵌套字典:

    q = '''
    COLUMN 1:
        A:                         10.68
        B:                         11.82
        C:                         12.93
        d:                         50.2
    COLUMN 2:
        Z:                         68
        S:                         182
        W:                         13
        E:                         50
    '''
    
    result = {}
    for line in q.split('\n'):
      if line.strip() and not line[0].isspace():
          col = line.strip()[:-1]
          result[col] = {}
      elif line.strip():
          key, value = line.split(':')
          result[col][key.strip()] = value.strip()
    
    print result
    

    结果:

    {'COLUMN 2': {'S': '182', 'Z': '68', 'E': '50', 'W': '13'}, 'COLUMN 1': {'A': '10.68', 'C': '12.93', 'B': '11.82', 'd': '50.2'}}
    

    或者,如果订单很重要,您可以创建COLUMN x - 按顺序列出并附加项目

    【讨论】:

    • 我不希望算法依赖于关键字 COLUMN
    • 然后将其除以: 并检查值是否为"" - 这将是您的COLUMN
    • 对不起,我没有清楚解释的混乱。请查看更新后的问题。
    • 如果你不喜欢上面的拆分方法,那么检查line.strip() and line[0].isspace()
    • key, value = line.split(':') ValueError: not enough values to unpack (expected 2, got 1)
    【解决方案3】:

    类似但略有调整:

    res = {}
    for row in data.split('\n'):
        if row[:4] != '    ':
            res[row.strip(':')] = sub = {}
        else:
            k,v = row.split(':')
            sub[k.strip()] =v.strip()
    
    print res
    

    输出是:

    {'C 2': {'S': '182', 'Z': '68', 'E': '50', 'W': '13'}, 'COLUMN 1': {'A': '10.68', 'C': '12.93', 'B': '11.82', 'D': '50.2'}}
    

    如果顺序很重要,请改用ordered_dict

    【讨论】:

    • 请编辑您的答案以使其适用于 Python3。此代码仅适用于 Python2.x。请参阅我在 Vor 的回答下的最后一条评论。
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多