如何解析 XY 坐标元组并将它们拆分为单独的 X 和 Y 列表
How to Parse XY Coordinate Tuples and Split Them Into Separate X and Y Lists
第一次寻求有关堆栈溢出的帮助,我实在是不知所措。
我目前正在做一个项目,我需要从非常大的可变长度 xml 文件中获取基于百分比的坐标元组,将它们分成单独的 X 和 Y 列表,然后找出两者之间的平均差异列表中的值。
我目前坚持将元组拆分为 X 和 Y 列表。
import xml.etree.ElementTree as ET'
lem = []
tree = ET.parse('testdata.xml')
root = tree.getroot()
for GazePointOnDisplayArea in root.findall("./GazeData/Left/GazePointOnDisplayArea"):
le = GazePointOnDisplayArea.get('Value')
lem.append(le)
print(lem)
#A test xml 文件缩短为五个元素给出以下输出
['(0.48734050, 0.50727710)', '(0.48989120, 0.50335540)', '(0.48709830, 0.50172430)', '(0.48531740, 0.50473010)', '(0.48797150, 0.51031550)']
理想情况下,我想以
结束
x = [0.48734050, 0.48989120, 0.48709830, 0.48531740, 0.48797150]
y = [0.50727710, 0.50335540, 0.50172430, 0.50473010, 0.51031550]
我已经尝试过 *zip 和映射方法,但似乎没有任何效果。我不确定我是否犯了解析错误,或者是否与小数有关,或者其他什么。
我愿意使用 python、numpy 或 pandas。
请指教
从输出中你得到它是你想要的输出的一个衬垫。
首先使用正则表达式提取数字,然后使用 numpy 重新排列它们:
import re
import numpy as np
text = ['(0.48734050, 0.50727710)', '(0.48989120, 0.50335540)', '(0.48709830, 0.50172430)', '(0.48531740, 0.50473010)', '(0.48797150, 0.51031550)']
x,y = np.array([[float(x) for x in re.findall(r"(\d+\.\d+)",line) ] for line in text]).T
你的问题是因为这实际上不是一个元组,而是一个字符串。
因此您首先需要将字符串元组转换为 python 文字元组。
例如'(0.48734050, 0.50727710)'
到 (0.48734050, 0.50727710)
ast.literal_eval()
帮助我们做到这一点!
import ast
lem = ['(0.48734050, 0.50727710)', '(0.48989120, 0.50335540)', '(0.48709830, 0.50172430)', '(0.48531740, 0.50473010)', '(0.48797150, 0.51031550)']
x_list = []
y_list = []
for str_tuple in lem:
x, y = ast.literal_eval(str_tuple)
x_list.append(x)
y_list.append(y)
>>> print(x_list)
[0.4873405, 0.4898912, 0.4870983, 0.4853174, 0.4879715]
>>> print(y_list)
[0.5072771, 0.5033554, 0.5017243, 0.5047301, 0.5103155]
第一次寻求有关堆栈溢出的帮助,我实在是不知所措。
我目前正在做一个项目,我需要从非常大的可变长度 xml 文件中获取基于百分比的坐标元组,将它们分成单独的 X 和 Y 列表,然后找出两者之间的平均差异列表中的值。
我目前坚持将元组拆分为 X 和 Y 列表。
import xml.etree.ElementTree as ET'
lem = []
tree = ET.parse('testdata.xml')
root = tree.getroot()
for GazePointOnDisplayArea in root.findall("./GazeData/Left/GazePointOnDisplayArea"):
le = GazePointOnDisplayArea.get('Value')
lem.append(le)
print(lem)
#A test xml 文件缩短为五个元素给出以下输出
['(0.48734050, 0.50727710)', '(0.48989120, 0.50335540)', '(0.48709830, 0.50172430)', '(0.48531740, 0.50473010)', '(0.48797150, 0.51031550)']
理想情况下,我想以
结束x = [0.48734050, 0.48989120, 0.48709830, 0.48531740, 0.48797150]
y = [0.50727710, 0.50335540, 0.50172430, 0.50473010, 0.51031550]
我已经尝试过 *zip 和映射方法,但似乎没有任何效果。我不确定我是否犯了解析错误,或者是否与小数有关,或者其他什么。
我愿意使用 python、numpy 或 pandas。
请指教
从输出中你得到它是你想要的输出的一个衬垫。 首先使用正则表达式提取数字,然后使用 numpy 重新排列它们:
import re
import numpy as np
text = ['(0.48734050, 0.50727710)', '(0.48989120, 0.50335540)', '(0.48709830, 0.50172430)', '(0.48531740, 0.50473010)', '(0.48797150, 0.51031550)']
x,y = np.array([[float(x) for x in re.findall(r"(\d+\.\d+)",line) ] for line in text]).T
你的问题是因为这实际上不是一个元组,而是一个字符串。
因此您首先需要将字符串元组转换为 python 文字元组。
例如'(0.48734050, 0.50727710)'
到 (0.48734050, 0.50727710)
ast.literal_eval()
帮助我们做到这一点!
import ast
lem = ['(0.48734050, 0.50727710)', '(0.48989120, 0.50335540)', '(0.48709830, 0.50172430)', '(0.48531740, 0.50473010)', '(0.48797150, 0.51031550)']
x_list = []
y_list = []
for str_tuple in lem:
x, y = ast.literal_eval(str_tuple)
x_list.append(x)
y_list.append(y)
>>> print(x_list)
[0.4873405, 0.4898912, 0.4870983, 0.4853174, 0.4879715]
>>> print(y_list)
[0.5072771, 0.5033554, 0.5017243, 0.5047301, 0.5103155]