求矩阵大对角线下的所有元素

2024-06-09 18:59:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下矩阵:

matrix = [
['a', 'p', 'p', 'l', 'e'],
['a', 'g', 'o', 'd', 'o'],
['n', 'n', 'e', 'r', 't'],
['g', 'a', 'T', 'A', 'C'],
['m', 'i', 'c', 's', 'r'],
['P', 'o', 'P', 'o', 'P']]

我试图找到大对角线下的所有元素。但我希望他们在某种程度上, 例如,理想输出为:

["ocAt", "PsC","or","P"]

(我想要字母以“向右上升对角线”的方式,这里的大对角线是“PiTro”)

我试过这样的方法:

    for f in range(len(matrix) - 1, -1, -1):
      for k in range(len(matrix)-1, 0, -1):
        my_list.append(matrix[k][k-f])

但是我要么得到一个超出范围的索引,要么不是好的元素。 如果有人有办法,我很高兴知道!你知道吗


Tags: orin元素forlen字母方式range
3条回答

其他方法:

width = len(matrix[0])
height =len(matrix)
result = [''] * (width-1)

number_elements_to_take = width-1
for row in reversed(matrix):
    i = 0
    for element in row[width - number_elements_to_take:]:
        result[i] += element
        i+=1
    number_elements_to_take -= 1

使用numpy

matrix = numpy.array([['a', 'p', 'p', 'l', 'e'],
                      ['a', 'g', 'o', 'd', 'o'],
                      ['n', 'n', 'e', 'r', 't'],
                      ['g', 'a', 'T', 'A', 'C'],
                      ['m', 'i', 'c', 's', 'r'],
                      ['P', 'o', 'P', 'o', 'P']])

result_list = [''.join(numpy.flipud(matrix[i:,i:]).diagonal())
               for i in range(1, len(matrix)-1)]

这是实现该结果的一种方法:

matrix = [['a', 'p', 'p', 'l', 'e'],
          ['a', 'g', 'o', 'd', 'o'],
          ['n', 'n', 'e', 'r', 't'],
          ['g', 'a', 'T', 'A', 'C'],
          ['m', 'i', 'c', 's', 'r'],
          ['P', 'o', 'P', 'o', 'P']]
my_list = []
for f in range(1, len(matrix[0])):
    s = []
    for k in range(len(matrix[0]) - f):
        s.append(matrix[len(matrix) - k - 1][f + k])
    my_list.append(''.join(s))
print(my_list)
# ['ocAt', 'PsC', 'or', 'P']

或使用理解:

my_list = [''.join(matrix[len(matrix) - i - 1][j + i] for i in range(len(matrix[0]) - j))
           for j in range(1, len(matrix[0]))]

要生成每个对角线中的每个子字符串,可以执行以下操作:

my_list = []
for j in range(1, len(matrix[0])):
    for i1 in range(0, len(matrix[0]) - j):
        for i2 in range(i1 + 1, len(matrix[0]) - j + 1):
            s = []
            for i in range(i1, i2):
                s.append(matrix[len(matrix) - i - 1][j + i])
            my_list.append(''.join(s))
print(my_list)
# ['o', 'oc', 'ocA', 'ocAt', 'c', 'cA', 'cAt', 'A', 'At', 't', 'P', 'Ps', 'PsC', 's', 'sC', 'C', 'o', 'or', 'r', 'P']

或等效地:

my_list = [''.join(matrix[len(matrix) - i - 1][j + i] for i in range(i1, i2))
           for j in range(1, len(matrix[0]))
           for i1 in range(0, len(matrix[0]) - j)
           for i2 in range(i1 + 1, len(matrix[0]) - j + 1)]

---

上对角线中的子串的一种解决方案:

my_list = []
for i in range(len(matrix)):
    for j1 in range(min(i + 1, len(matrix[0]))):
        for j2 in range(j1, min(i + 1, len(matrix[0]))):
            s = []
            for j in range(j1, j2 + 1):
                s.append(matrix[i - j][j])
            my_list.append(''.join(s))
print(my_list)
# ['a', 'a', 'ap', 'p', 'n', 'ng', 'ngp', 'g', 'gp', 'p', 'g',
#  'gn', 'gno', 'gnol', 'n', 'no', 'nol', 'o', 'ol', 'l', 'm',
#  'ma', 'mae', 'maed', 'maede', 'a', 'ae', 'aed', 'aede', 'e',
#  'ed', 'ede', 'd', 'de', 'e', 'P', 'Pi', 'PiT', 'PiTr', 'PiTro',
#  'i', 'iT', 'iTr', 'iTro', 'T', 'Tr', 'Tro', 'r', 'ro', 'o']

相关问题 更多 >