【问题标题】:Converting a raw input in python to a list of lists将python中的原始输入转换为列表列表
【发布时间】:2014-07-15 09:47:27
【问题描述】:

我的原始输入格式为"(1,2,3)","(3,4,5)","(6,7,8)",我想将其转换为列表l = [[1,2,3],[3,4,5],[6,7,8]]。我尝试像这样用正则表达式剥离

    re.findall("(?<=\()?\d+(?=\)?)",s)

但是这个正则表达式的问题在于它只是去掉了每一个数字并且几乎等同于

    re.findall("\d+", s)

我正在寻找一段简单的代码,我不想通过浏览整个输入并检查它是否是我想要的东西来走很长的路。

还有谁能告诉我,python 中的 raw_input 是否默认被视为字符串?

【问题讨论】:

  • 在 Python 2.x 中 raw_input 是一个字符串,是的。

标签: python regex list parsing


【解决方案1】:

你可以这样做

  1. 去掉所有的双引号

  2. 使用ast.literal_eval获取元组的元组

  3. 使用列表理解和list 函数将元组的元组转换为列表的列表

    data = """"(1,2,3)","(3,4,5)","(6,7,8)"""""
    from ast import literal_eval
    print [list(item) for item in literal_eval(data.replace('"', ""))]
    # [[1, 2, 3], [3, 4, 5], [6, 7, 8]]
    

【讨论】:

    【解决方案2】:

    尝试:

    s = '"(1,2,3)","(3,4,5)","(6,7,8)"'
    [map(int, i[1:-1].split(',')) for i in s[1:-1].split('","')]
    

    【讨论】:

      【解决方案3】:

      尝试以下方法:

      a = '"(1,2,3)","(3,4,5)","(6,7,8)"'
      new_a = [list(eval(x)) for x in eval(a)]
      

      您也可以使用 ast.literal_eval() 代替 eval() 以确保安全!

      【讨论】:

      • eval 是危险的矫枉过正。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多