小编CTK*_*ein的帖子

大多数pythonic方式打破高度分支的解析器

我正在为一个特定类型的文件开发一个解析器,这个文件被一些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)

python iterator loops python-2.7

5
推荐指数
1
解决办法
128
查看次数

删除3D numpy数组中包含负值的"行"

是)我有的:

>>> 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)

python arrays numpy

2
推荐指数
1
解决办法
1282
查看次数

两个列表之间的异构组合

什么是在两个列表之间生成唯一组合对的更好方法,其中对也必须是异构的(即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)

python

0
推荐指数
1
解决办法
723
查看次数

标签 统计

python ×3

arrays ×1

iterator ×1

loops ×1

numpy ×1

python-2.7 ×1