Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将信息从字符串转换为dict_Python_Python 3.x_Dictionary_Text - Fatal编程技术网

Python 将信息从字符串转换为dict

Python 将信息从字符串转换为dict,python,python-3.x,dictionary,text,Python,Python 3.x,Dictionary,Text,我有这样一个字符串: COLUMN 1: A: 10.68 B: 11.82 C: 12.93 D: 50.2 C 2: Z: 68 S: 182 W:

我有这样一个字符串:

COLUMN 1:
    A:                         10.68
    B:                         11.82
    C:                         12.93
    D:                         50.2
C 2:
    Z:                         68
    S:                         182
    W:                         13
    E:                         50    
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
在数据结构(如字典)中保存这些信息的好方法是什么


更新:问题是,在我的实际文本中,标题不一定以列开头,每个标题下的元素数量可能不同于其他标题。唯一不同的元素是,在每个标题下,元素缩进4个空格

您可以像这样创建嵌套dict:

COLUMN 1:
    A:                         10.68
    B:                         11.82
    C:                         12.93
    D:                         50.2
C 2:
    Z:                         68
    S:                         182
    W:                         13
    E:                         50    
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'}}
或者,如果顺序很重要,您可以根据客户的回答,在
列x
-中列出并按顺序追加项目

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)
遵守规则:

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

更改是,您可以将每个根键,
列X
存储在一个var中,并检查此根键上方的所有行,然后迭代并更新此键。

类似于此,只需稍加调整:

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

如果顺序很重要,请改用顺序命令

我不明白。你能给出一个你想要转换的字符串的具体例子吗?嵌套的dict可以像{1:{'a':10.68,'B':11.82},2:{'Z':68,'S':182}那样使用。像列[1]['A']一样访问它。@Tristan是的,这似乎是一个非常有用的结构。@Tristan你应该把它作为一个答案而不是一个注释。不是代码编写服务。请回顾并向我们展示您试图解决此问题的方法。我不希望算法依赖于关键字列,然后将其按
拆分,并检查值是否为
——这将是您的
,很抱歉我没有清楚解释。请查看更新的问题。如果您不喜欢上述拆分方法,请检查
line.strip()和line[0].isspace()
key,value=line.split(“:”)value错误:没有足够的值来解包(预期为2,得到1)
请编辑您的答案以使其适用于Python3。此代码仅在Python2.x中有效。请参阅Vor答案下的最后一条评论。