从Python的字符串中提取列表

时间:2018-07-04 16:59:44

标签: python string dataset extract

我正在尝试使用康奈尔电影数据集来创建聊天机器人。这是我要提取的字符串列表的格式,另存为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(','))

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

3 个答案:

答案 0 :(得分: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']]

答案 1 :(得分:1)

  • 使用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']]

答案 2 :(得分:1)

为了理解您的问题是什么,有助于了解上下文。幸运的是,我完全了解上下文,因为我参加了与您相同的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循环,您将在convs列表中填充多个4位数字字符串。有帮助吗?