【问题标题】:Extracting List from Within a String in Python从 Python 中的字符串中提取列表
【发布时间】:2018-12-13 03:58:08
【问题描述】:

我正在尝试使用康奈尔电影数据集来创建聊天机器人。这是我要从中提取的字符串列表的格式,保存为 conv_lines:

["u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L194', 'L195', 'L196', 'L197']",
 "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L198', 'L199']",
 "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L200', 'L201', 'L202', 'L203']"] 

我正在尝试通过提取每个字符串中的列表,从上面的字符串列表中创建以下列表。

[['L194', 'L195', 'L196', 'L197'],
 ['L198', 'L199'],
 ['L200', 'L201', 'L202', 'L203']]

我找到了这段代码,但不明白它是如何工作的。有人请解释一下。

convs = [ ]
for line in conv_lines[:-1]:
    _line = line.split(' +++$+++ ')[-1][1:-1].replace("'","").replace(" ","")
    convs.append(_line.split(','))

我不明白为什么 [:-1] 用在 for 语句中,以及在拆分后的代码之后。

【问题讨论】:

    标签: python string dataset extract


    【解决方案1】:

    您可以使用ast.literal_evalre

    import re, ast
    d = ["u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L194', 'L195', 'L196', 'L197']","u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L198', 'L199']", "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L200', 'L201', 'L202', 'L203']"]
    new_d = [ast.literal_eval(re.findall('\[[\w\W]+\]', i)[0]) for i in d]
    

    输出:

    [['L194', 'L195', 'L196', 'L197'], ['L198', 'L199'], ['L200', 'L201', 'L202', 'L203']]
    

    【讨论】:

      【解决方案2】:
      • 使用re 查找[] 之间的内容
      • 使用ast.literal_eval获取列表对象

      演示:

      import re
      import ast
      data = ["u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L194', 'L195', 'L196', 'L197']",
       "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L198', 'L199']",
       "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L200', 'L201', 'L202', 'L203']"]
      
      res = []
      for i in data:
          val = re.findall(r"\[.*?\]", i)[0]
          res.append(ast.literal_eval(val))
      print(res)
      

      输出:

      [['L194', 'L195', 'L196', 'L197'], ['L198', 'L199'], ['L200', 'L201', 'L202', 'L203']]
      

      【讨论】:

      • 如何将值附加到外部列表而不是打印?
      • 更新了 sn-p。
      • 我收到 IndexError: list index out of range 错误。
      • 看起来有些字符串没有提到的内容
      【解决方案3】:

      为了理解您的问题,了解上下文会有所帮助。幸运的是,我确切地知道上下文,因为我参加了与您相同的 Udemy 课程。 ;)

      convs = []
      for line in conv_lines[:-1]:
          _line = line.split(' +++$+++ ')[-1][1:-1].replace("'","").replace(" ","")
          convs.append(_line.split(','))
      

      for items in some_list[:-1] 通常意味着您正在遍历列表,直到并排除该列表中的最后一项。

      例如:

      l = [1,2,3,4]
      for i in l[:-1]:
          print(i)
      Out[ ]:
      1
      2
      3
      

      现在了解这对您发布的代码意味着什么。在for 语句中,您每行抓取除最后一项之外的所有内容。所以最后一项一定是没用的垃圾。不要相信我的话。检查。 print(conv_lines[-1]) 告诉你什么?

      现在是 [-1] 的其他用途。 尝试首先使用原始数据中的一行来分解它。

      line = "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L194', 'L195', 'L196', 'L197']"
      convs = []
      _line = line.split(' +++$+++ ')[-1] # notice I truncated after this.
      convs.append(_line.split(','))
      

      这会返回什么?

      convs
      Out[ ]:
      [["['L194'", " 'L195'", " 'L196'", " 'L197']"]]
      

      现在怎么样。

      convs = []
      _line = line.split(' +++$+++ ')[-1][1:-1] # truncated again, but after adding back a bit.
      convs.append(_line.split(','))
      

      这会返回什么?

      convs
      Out[ ]:
      [["'L194'", " 'L195'", " 'L196'", " 'L197'"]]
      

      继续。

      convs = []
      _line = line.split(' +++$+++ ')[-1][1:-1].replace("'","") # truncated less
      convs.append(_line.split(','))
      

      返回:

      convs
      Out[ ]:
      [['L194', ' L195', ' L196', ' L197']]
      

      最后:

      convs = []
      _line = line.split(' +++$+++ ')[-1][1:-1].replace("'","").replace(" ","")
      convs.append(_line.split(','))
      

      返回超数据科学人员提供的其余代码所需的内容:

      convs
      Out[ ]:
      [['L194', 'L195', 'L196', 'L197']]
      

      请记住,此示例仅使用一行。使用for 循环,您将使用不止一个4 位字符串列表填充convs 列表。这有帮助吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多