在Python中从字符串中提取列表

在Python中从字符串中提取列表,python,string,dataset,extract,Python,String,Dataset,Extract,我正在尝试与康奈尔电影数据集合作创建聊天机器人。以下是我要从中提取的字符串列表的格式,另存为conv_行: ["u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L194', 'L195', 'L196', 'L197']", "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L198', 'L199']", "u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L200', 'L201', 'L202', 'L203']"]

我正在尝试与康奈尔电影数据集合作创建聊天机器人。以下是我要从中提取的字符串列表的格式,另存为conv_行:

["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(','))

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

您可以使用
ast.literal\u eval
re

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']]
  • 使用
    re
    查找
    []
  • 使用
    ast.literal\u 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']]
输出:

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

为了理解你的问题是什么,了解上下文很有帮助。幸运的是,我完全了解上下文,因为我的课程与你的课程相同

对于某些列表中的项目[:-1]
通常意味着您正在迭代列表,直到并排除该列表中的最后一项

例如:

l = [1,2,3,4]
for i in l[:-1]:
    print(i)
Out[ ]:
1
2
3
现在看看这对你发布的代码意味着什么。在
for
语句中,除了最后一项之外,您将获取每行的所有内容。所以最后一项必须是无用的垃圾。别相信我的话。检查一下。
打印(转换行[-1])
显示了什么

现在,对于[-1]的其他用法。首先尝试通过仅使用原始数据中的一行来分解它

这是什么回报

convs
Out[ ]:
[["['L194'", " 'L195'", " 'L196'", " 'L197']"]]
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
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(','))
返回superdatascience人员提供的其余代码所需的内容:

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

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

如何将值附加到外部列表中而不是打印?更新的代码段。我收到Indexer错误:列表索引超出范围。某些字符串似乎没有提到的内容