【问题标题】:How to parse a string without comma to python list?如何将不带逗号的字符串解析为python列表?
【发布时间】:2020-07-30 10:39:30
【问题描述】:

我想将这样的字符串解析为 python 列表:

"[[ 3.14  2.12] [1.11 2.22 ] [10.0 12.0]]"    # Not separated by comma

我尝试使用eval() 函数,但由于语法无效而失败。 有没有另一种方法可以轻松地将这样的字符串解析成 python 列表?

我希望实现的是像这样获得一个真正的python列表:

mylist = [[ 3.14,  2.12], [1.11, 2.22 ], [10.0, 12.0]]

mylist[0] 将返回 [3.14, 2.12] 和 mylist[0][1] 将返回 2.12。

【问题讨论】:

  • 你想在这里实现什么?列表列表必须用逗号分隔。您可以将其形成为不带逗号的字符串
  • 记住字符串是不可变的,所以一旦你将字符串解析到列表中,如果你想要实现的话,你必须用空格替换逗号。
  • @AzyCrw4282 我从别人那里得到了一些数据,这些数据是二维平面上点的一些坐标。现在我希望将字符串 "[[ 3.14 2.12] [1.11 2.22 ] [10.0 12.0]]" 转换成这样的真实列表 [[3.14, 2.12], [1.11, 2.22 ], [10.0, 12.0]]。跨度>
  • 只需通过“蛮力”解析(拆分为 [ ] 中的项目序列,然后拆分对)并在 5 分钟内完成。
  • @JimWang 我已经更新了答案。让我知道它是否有帮助,或者您是否需要一种稳健的方法。

标签: python string list numpy parsing


【解决方案1】:
x= "[[3.14 2.12] [1.11 2.22] [10.0 12.0]]"
z=[y.strip().split(']')[0].split(' ') for y in x.split('[') if y!='']

解释:在

上拆分 x
'[' produces-->['', '', '3.14 2.12] ', '1.11 2.22] ', '10.0 12.0]]']

使用条件 if y!='' 在此拆分上产生

['3.14 2.12] ', '1.11 2.22] ', '10.0 12.0]]']

使用 y.strip() 删除每个元素末尾的多余空格。剥离 ']' 产生

 [['3.14 2.12', ''], ['1.11 2.22', ''], ['10.0 12.0', '', '']]

现在,我们可以看到只有第一个元素有我们的值,取 index =0 & split on '' products

 [['3.14', '2.12'], ['1.11', '2.22'], ['10.0', '12.0']]

【讨论】:

    【解决方案2】:

    re.sub 可用于在每个嵌套列表和数字后添加逗号。

    import re
    
    s = "[[ 3.14  2.12] [1.11 2.22 ] [10.0 12.0]]"
    
    def add_comma(match):
        return match.group(0) + ','
    
    s = re.sub(r'\[[0-9\.\s]+\]', add_comma, s)
    s = re.sub(r'([0-9\.]+)', add_comma, s)
    mylist = eval(s)
    

    【讨论】:

      【解决方案3】:

      这只是用逗号替换空格,然后使用ast 模块,您可以将列表列表的字符串表示形式转换为列表。

      import ast
      h = "[[3.14 2.12] [1.11 2.22] [10.0 12.0]]"
      a = str(h).replace( ' ' , ',' )
      x = ast.literal_eval(a)
      print(x)
      

      输出

      [[3.14, 2.12], [1.11, 2.22], [10.0, 12.0]] # of type lists of list
      

      另外,请注意,这是一种相当幼稚的方法,因为这需要列表的列表的字符串表示形式正确。

      例如这是有效的[[3.14 2.12] [1.11 2.22] [10.0 12.0]],而[[ 3.14 2.12] [1.11 2.22 ] [10.0 12.0]] 这不是因为这里存在空格,例如[[ 3.14]

      【讨论】:

      • 有时不会在数字前加逗号吗? OP 的数据是 "[[ 3.14 2.12] [1.11 2.22 ] [10.0 12.0]]" 而不是 "[[3.14 2.12] [1.11 2.22] [10.0 12.0]]"
      • 确实如此。但我相信这个字符串只是一个例子,并不能准确地说明所有输入的样子。无论哪种方式,答案中都明确说明了这一点。看起来你的会是很好的解决方案
      • 真的,关于空格的问题有点不清楚,我同意你的问题是最好的解决方案,正如你所说,你只需要用逗号替换每个空格。我也喜欢使用ast,如果您添加解释为什么ast.literal_eval 是解决此问题的好选择,可能会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多