从 Python 中的字符串中提取列表
Extracting List from Within a String in Python
我正在尝试使用康奈尔电影数据集来创建聊天机器人。这是我要从中提取的字符串列表的格式,保存为 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]。
您可以使用 ast.literal_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_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']]
为了理解你的问题是什么,了解上下文会有所帮助。幸运的是,我确切地知道上下文,因为我参加了与您相同的 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(','))
这是什么return?
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(','))
这 return 是什么意思?
convs
Out[ ]:
[["'L194'", " 'L195'", " 'L196'", " 'L197'"]]
继续。
convs = []
_line = line.split(' +++$+++ ')[-1][1:-1].replace("'","") # truncated less
convs.append(_line.split(','))
Returns:
convs
Out[ ]:
[['L194', ' L195', ' L196', ' L197']]
最后:
convs = []
_line = line.split(' +++$+++ ')[-1][1:-1].replace("'","").replace(" ","")
convs.append(_line.split(','))
Returns 超级数据科学人员提供的其余代码需要什么:
convs
Out[ ]:
[['L194', 'L195', 'L196', 'L197']]
请记住,此示例仅使用一行。使用 for
循环,您将使用不止一个 4 位字符串列表填充 convs
列表。有帮助吗?
我正在尝试使用康奈尔电影数据集来创建聊天机器人。这是我要从中提取的字符串列表的格式,保存为 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]。
您可以使用 ast.literal_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_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']]
为了理解你的问题是什么,了解上下文会有所帮助。幸运的是,我确切地知道上下文,因为我参加了与您相同的 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(','))
这是什么return?
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(','))
这 return 是什么意思?
convs
Out[ ]:
[["'L194'", " 'L195'", " 'L196'", " 'L197'"]]
继续。
convs = []
_line = line.split(' +++$+++ ')[-1][1:-1].replace("'","") # truncated less
convs.append(_line.split(','))
Returns:
convs
Out[ ]:
[['L194', ' L195', ' L196', ' L197']]
最后:
convs = []
_line = line.split(' +++$+++ ')[-1][1:-1].replace("'","").replace(" ","")
convs.append(_line.split(','))
Returns 超级数据科学人员提供的其余代码需要什么:
convs
Out[ ]:
[['L194', 'L195', 'L196', 'L197']]
请记住,此示例仅使用一行。使用 for
循环,您将使用不止一个 4 位字符串列表填充 convs
列表。有帮助吗?