我正在为一个特定类型的文件开发一个解析器,这个文件被一些header关键字分成几部分,后面跟着一堆异构数据.标题始终用空行分隔.以下内容:
Header_A
1 1.02345
2 2.97959
...
Header_B
1 5.1700 10.2500
2 5.0660 10.5000
...
Run Code Online (Sandbox Code Playgroud)
每个标头包含非常不同类型的数据,并且根据块内的某些关键字,数据必须存储在不同的位置.我采用的一般方法是使用一些正则表达式捕获所有可以定义标题的关键字,然后遍历文件中的行.一旦找到匹配项,我会弹出行直到我到达一个空行,将所有数据存储在相应位置的行中.
这是代码的基本结构,其中"使用current_line做东西"将涉及一堆分支,具体取决于该行包含的内容:
headers = re.compile(r"""
((?P<header_a>Header_A)
|
(?P<header_b>Header_B))
""", re.VERBOSE)
i = 0
while i < len(data_lines):
match = header.match(data_lines[i])
if match:
if match.group('header_a'):
data_lines.pop(i)
data_lines.pop(i)
# not end of file not blank line
while i < len(data_lines) and data_lines[i].strip():
current_line = data_lines.pop(i)
# do stuff with current_line
elif match.group('header_b'):
data_lines.pop(i)
data_lines.pop(i)
while i < len(data_lines) and data_lines[i].strip():
current_line = data_lines.pop(i)
# do stuff with …Run Code Online (Sandbox Code Playgroud) >>> forces
array([[[ 63.82078252, 0.63841691],
[ -62.45826693, 7.11946976],
[ -87.85946925, 15.1988562 ],
[-120.49417797, -16.31785819],
[ -81.36080338, 6.45074645]],
[[ 364.99959095, 4.92473888],
[ 236.5762723 , -7.22959548],
[ 69.55657789, 1.20164815],
[ -22.1684177 , 13.42611095],
[ -91.19739147, -16.15076634]]])
Run Code Online (Sandbox Code Playgroud)
force [0]和force [1]每个都包含一个配对值列表,例如63.82078252和0.63841691是一个数据点.
>>> forces
array([[[ 63.82078252, 0.63841691]],
[[ 364.99959095, 4.92473888],
[ 236.5762723 , -7.22959548],
[ 69.55657789, 1.20164815]]])
Run Code Online (Sandbox Code Playgroud)
但是这种类型的结构是不可能的,因为两个力片具有不同的尺寸:分别为(1,2)和(3,2).
>>> forces[:,:,0][forces[:,:,0] < 0] = np.nan
>>> forces
array([[[ 63.82078252, 0.63841691],
[ nan, 7.11946976],
[ nan, 15.1988562 ],
[ nan, -16.31785819],
[ nan, 6.45074645]], …Run Code Online (Sandbox Code Playgroud) 什么是在两个列表之间生成唯一组合对的更好方法,其中对也必须是异构的(即pair [0]!= pair [1])?通过组合,我的意思是我只想要一份(2, 1)和(1, 2).(有更好的方式来表达这个吗?)
例如:
a = [1, 4]
b = [1, 2, 3]
magic_functions(a, b)
Run Code Online (Sandbox Code Playgroud)
应该返回:
[(1, 2), (4, 2), (1, 3), (4, 1), (4, 3)]
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法到达那里,但似乎有点麻烦:
prod = itertools.product(a, b)
pairs = set()
for x, y in prod:
if x != y and (y, x) not in pairs:
pairs.add((x, y))
Run Code Online (Sandbox Code Playgroud)