如何在 python 中多次解析
How to parse multiple times in python
我正在尝试解析从 txt 文件中读取的字符串。
该行是:
(0 ,3) :5.0|(1 ,3) : -5.0
我需要先得到 (0,3) 然后是 5,用 "|" 分割后我需要得到 (1,3) 和 -5
最后, 我应该有 2 个单独保存值的列表变量。
第一个列表应该有:(0,3)和(1,3)
第二个列表应该包含:5,-5
我尝试了什么:
goal_states, their_reward = lines[5].split("|"), lines[5].rsplit(':', 1)
我得到的是:['(0,3):5.0|(1,3)', '-5.0']
提前致谢
P.S: 我不应该使用任何导入语句。
您可以将竖线转换为逗号,然后将其格式化为字典并使用 ast 的 literal_eval
为自己提供字典以供使用
import ast
s = "(0 ,3) :5.0|(1 ,3) : -5.0"
s = s.replace("|", ",")
ast.literal_eval(f"{{{s}}}")
{(0, 3): 5.0, (1, 3): -5.0}
我已经解决了这个执行多重拆分操作的问题。
goal_states=[]
their_obstacles=[]
for i in "(0 ,3) :5.0|(1 ,3) : -5.0".split("|"):
goal_states.append(i.split(":")[0])
their_obstacles.append(i.split(":")[1])
literal_eval
@Sayse 使用的方法当然是最直接的方法。但是如果你想做一些解析,你可以这样做:
txt = "(0 ,3) :5.0|(1 ,3) : -5.0"
txt = txt.replace(" ", "")
goal_states = []
their_rewards = []
for i in txt.split('|'): # ['(0,3):5.0', '(1,3):-5.0']
a, b = i.split(':')
_, n1, _, n2, _ = a # `a` is something like '(0,3)'
n1 = int(n1)
n2 = int(n2)
goal_states.append((n1, n2))
their_rewards.append(int(float(b)))
print(goal_states)
print(their_rewards)
输出:
[(0, 3), (1, 3)]
[5, -5]
这可以通过列表理解来实现:
例如:
string = "(0, 3): 5.0|(1 ,3) : -5-0"
parsed_list1, parsed_list2 = [i.split(":") for i in string.split("|")]
print(parsed_list1)
print(parsed_list2)
输出:
['(0, 3)', '5.0']
['(1 ,3)', '-5-0']
希望这就是你想要的。
s = "(0 ,3) :5.0|(1 ,3) : -5.0"
def get_result(s: str) -> tuple:
goals = []
rewards = []
for pair in s.split("|"):
goal, reward = pair.split(":")
goals.append(eval(goal.strip()))
rewards.append(float(reward.strip()))
return (goals, rewards)
print(get_result(s))
我正在尝试解析从 txt 文件中读取的字符串。 该行是:
(0 ,3) :5.0|(1 ,3) : -5.0
我需要先得到 (0,3) 然后是 5,用 "|" 分割后我需要得到 (1,3) 和 -5
最后, 我应该有 2 个单独保存值的列表变量。 第一个列表应该有:(0,3)和(1,3) 第二个列表应该包含:5,-5
我尝试了什么:
goal_states, their_reward = lines[5].split("|"), lines[5].rsplit(':', 1)
我得到的是:['(0,3):5.0|(1,3)', '-5.0']
提前致谢
P.S: 我不应该使用任何导入语句。
您可以将竖线转换为逗号,然后将其格式化为字典并使用 ast 的 literal_eval
为自己提供字典以供使用
import ast
s = "(0 ,3) :5.0|(1 ,3) : -5.0"
s = s.replace("|", ",")
ast.literal_eval(f"{{{s}}}")
{(0, 3): 5.0, (1, 3): -5.0}
我已经解决了这个执行多重拆分操作的问题。
goal_states=[]
their_obstacles=[]
for i in "(0 ,3) :5.0|(1 ,3) : -5.0".split("|"):
goal_states.append(i.split(":")[0])
their_obstacles.append(i.split(":")[1])
literal_eval
@Sayse 使用的方法当然是最直接的方法。但是如果你想做一些解析,你可以这样做:
txt = "(0 ,3) :5.0|(1 ,3) : -5.0"
txt = txt.replace(" ", "")
goal_states = []
their_rewards = []
for i in txt.split('|'): # ['(0,3):5.0', '(1,3):-5.0']
a, b = i.split(':')
_, n1, _, n2, _ = a # `a` is something like '(0,3)'
n1 = int(n1)
n2 = int(n2)
goal_states.append((n1, n2))
their_rewards.append(int(float(b)))
print(goal_states)
print(their_rewards)
输出:
[(0, 3), (1, 3)]
[5, -5]
这可以通过列表理解来实现:
例如:
string = "(0, 3): 5.0|(1 ,3) : -5-0"
parsed_list1, parsed_list2 = [i.split(":") for i in string.split("|")]
print(parsed_list1)
print(parsed_list2)
输出:
['(0, 3)', '5.0']
['(1 ,3)', '-5-0']
希望这就是你想要的。
s = "(0 ,3) :5.0|(1 ,3) : -5.0"
def get_result(s: str) -> tuple:
goals = []
rewards = []
for pair in s.split("|"):
goal, reward = pair.split(":")
goals.append(eval(goal.strip()))
rewards.append(float(reward.strip()))
return (goals, rewards)
print(get_result(s))