【问题标题】:Splitting bracket-separated string to a dictionary将括号分隔的字符串拆分为字典
【发布时间】:2017-03-12 19:11:23
【问题描述】:

我想让这个字符串成为字典。

s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'

关注

{'SEQ':'A=1%B=2', 'OPS':'CC=0%G=2', 'T1':'R=N', 'T2':'R=Y'}

我试过这个代码

d = dict(item.split('(') for item in s.split(')'))

但是发生了错误

ValueError: dictionary update sequence element #4 has length 1; 2 is required

我知道为什么会出现这个错误,解决方法是删除end的括号

s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y'

但这对我不利。有没有其他好的解决方案可以让这个字符串成为字典类型...?

【问题讨论】:

    标签: python string dictionary


    【解决方案1】:

    更简洁:

    import re
    
    s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'
    print dict(re.findall(r'(.+?)\((.*?)\)', s))
    

    【讨论】:

    • 完美的解决方案,更简洁的方法。
    【解决方案2】:

    在生成器表达式中添加if 条件。

    >>> s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'
    >>> s.split(')')
    ['SEQ(A=1%B=2', 'OPS(CC=0%G=2', 'T1(R=N', 'T2(R=Y', '']
    >>> d = dict(item.split('(') for item in s.split(')') if item!='')
    >>> d
    {'T1': 'R=N', 'OPS': 'CC=0%G=2', 'T2': 'R=Y', 'SEQ': 'A=1%B=2'}
    

    【讨论】:

    • 我还建议说 if item 而不是 if item !='' 因为 '' 无论如何都是一个空字符串。
    【解决方案3】:

    或者,这可以通过正则表达式来解决:

    >>> import re
    >>> s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'
    >>> print dict(match.groups() for match in re.finditer('([^(]+)\(([^)]+)\)', s))
    {'T1': 'R=N', 'T2': 'R=Y', 'SEQ': 'A=1%B=2', 'OPS': 'CC=0%G=2'}
    

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多