从之字形配置获取元素的索引

时间:2018-10-10 15:47:01

标签: python

“如何获取n行数组配置中元素的索引? 行的长度应由长度为l的字符串给出。

例如:

对于l = 7的2行数组配置,元素(X)将具有索引:

elements = [(0, 0), (0, 2), (0, 4), (0, 6), (1, 1), (1, 3), (1, 5), (1, 7)]

[[X - X - X - X],
 [- X - X - X -]]

对于l = 8的3行数组,元素(X)将具有索引:

elements = [(0, 0), (0, 4), (0, 8), (1, 1), (1, 3), (1, 5), (1, 7), (2, 2), (2, 6)]

[[X - - - X - - - X],
 [- X - X - X - X -],
 [- - X - - - X - -]]

想法是扩展到更高的行号。有没有获取这些索引的“分析”方法?

谢谢。

P.S .:“分析”是指方程式或我可以编码的东西

3 个答案:

答案 0 :(得分:1)

这是我针对您的问题的第一枪:

def grid(width, depth):

    assert depth % 2 == 0
    height = depth//2 + 1

    lines = []
    for y in range(height):
        line = ''.join('X' if ((i+y) % depth == 0 or (i-y) % depth == 0) 
                           else '-' for i in range(width))
        lines.append(line)

    return '\n'.join(lines)

depth是定义X在第一行中有多远的参数(名称选择不当); width是每行应显示多少个字符。

这仅适用于depth秒。

有输出

-> print(grid(width=10, depth=2))
X-X-X-X-X-
-X-X-X-X-X

-> print(grid(width=10, depth=4))
X---X---X-
-X-X-X-X-X
--X---X---

-> print(grid(width=15, depth=6))
X-----X-----X--
-X---X-X---X-X-
--X-X---X-X---X
---X-----X-----

这主要是反复试验,所以没有太多解释...


如果您希望使用elements表示形式,可以执行以下操作:

def grid_elements(width, depth):

    assert depth % 2 == 0
    height = depth//2 + 1

    elements = []
    for y in range(height):
        elements.extend((y, i) for i in range(width) 
                        if ((i+y) % depth == 0 or (i-y) % depth == 0))

    return elements

这将创建结果:

-> print(grid_elements(width=10, depth=2))
[(0, 0), (0, 2), (0, 4), (0, 6), (0, 8), (1, 1), (1, 3), (1, 5), (1, 7), (1, 9)]

-> print(grid_elements(width=10, depth=4))
[(0, 0), (0, 4), (0, 8), (1, 1), (1, 3), (1, 5), (1, 7), (1, 9), (2, 2), (2, 6)]

-> print(grid_elements(width=15, depth=6))
[(0, 0), (0, 6), (0, 12), (1, 1), (1, 5), (1, 7), (1, 11), (1, 13), (2, 2), 
 (2, 4), (2, 8), (2, 10), (2, 14), (3, 3), (3, 9)]

答案 1 :(得分:1)

这是可以执行此操作的代码示例。

import numpy as np

nb_row = 3; nb_column = 10;

separator_element = '-'; element = 'X';

#Initialise the size of the table
table = np.chararray((nb_row, nb_column), itemsize=1);
table[:] = separator_element; #By default, all have the separator element.

#Loop over each column: First column have element at first row. The element
#will after decrease and wrap around the nb of row.
#When at the bottom, switch to go up. At top, switch to go down.
position_element = 0; go_down = 1;
for no_column in xrange(0,nb_column):
    table[position_element,no_column] = element;

    #Case when go down.
    if go_down == 1:
        position_element = (position_element+1) % (nb_row);

        go_down = (position_element != (nb_row-1)); #Go up after go down.

    #Case when go up;
    else:
        position_element = (position_element-1) % (nb_row);

        go_down = (position_element == 0); #Go up after go down.
    #end

#end
print(table)
#[['X' '-' '-' '-' 'X' '-' '-' '-' 'X' '-']
#['-' 'X' '-' 'X' '-' 'X' '-' 'X' '-' 'X']
#['-' '-' 'X' '-' '-' '-' 'X' '-' '-' '-']]

答案 2 :(得分:0)

我们可以在此处使用itertools.groupby创建具有以下内容的字典: 子列表的索引作为值,子列表的索引作为键{0: [0, 2, 4, 6], 1: [1, 3, 5, 7]},然后我们可以在使用n = 7生成的列表中使用它。从那里,我们可以使用索引来修改子列表,这些索引是键中相应子列表索引的值。

from itertools import groupby
elements = [(0, 0), (0, 2), (0, 4), (0, 6), (1, 1), (1, 3), (1, 5), (1, 7)]


n = 7
d = {}

for k, g in groupby(elements, key=lambda x: x[0]):
    d[k] = [i[1] for i in g]

lst = [['-']*n for i in d]

for k in d:
    for i, v in enumerate(lst[k]):
        if i in d[k]:
            lst[k][i] = 'X'
    lst[k] = ' '.join(lst[k])

for i in lst:
    print(i)
#  X - X - X - X
#  - X - X - X -