Как лучше всего найти диагонали сетки?

Итак, я пытаюсь найти диагонали на сетке. Я пробовал смотреть на некоторые страницы переполнения стека, которые, казалось, давали подсказку, но большинство из них включает itertools или numpy и множество встроенных функций.

Примечание . Возможно, вы видели этот вопрос где-нибудь еще. По сути, это второй аккаунт @Bruffff.

Итак, я просто спрашиваю от имени всех новичков здесь, какой самый простой способ найти все диагонали в данной сетке.

Вот что у меня есть на данный момент:

      def columns(test):
    ans = []
    for x, lst in enumerate(test):
        if x < len(test)-1:
           ans.append(lst[x+1])
    return ans
print(columns(test))

и учитывая эту сетку,

      test = [["r","a","w","b","i","t"],
        ["x","a","y","z","c","h"],
        ["p","q","b","e","i","e"],
        ["t","r","s","b","o","g"],
        ["u","w","x","v","i","t"]
        ["u","w","x","v","i","t"],

вывод возвращается

      ['a', 'y', 'e', 'o', 't']

но мой ожидаемый результат

      [(u), (uw) (twx), (prxv), (xqsvi), (rabbit), (ayeot), (wzig), (bce),(ih), (t)]

Как я могу сделать это без использования сложных встроенных функций и import, numpy или itertools??

Я знаю, что они могут быть проще, но я хочу сначала изучить вещи, используя основы, поэтому да, пожалуйста, используйте для этого самые простые подходы. Спасибо:)

3 ответа

      def Diagonals(test):
    l = len(test)
    temp = [] # Add whitespaces to end
    result = []
    for row in test:
        temp.append([" "]*(l-1)+row+[" "]*(l-1))
    test = temp
    for i in range(l):
        current = ""
        for j in range(2*l-1):
            current += test[i+j][j]
        result.append(current.strip())
    return result

Этот код добавляет пробелы в конец списка, чтобы он мог просто получить все (6) диагонали длины, а затем обрезает пробелы в конце.

т.е. для 3

      *.bob..
.*obo..
..*ob..

.*bob..
..*bo..
..b*b..

..*ob..
..o*o..
..bo*..

..b*b..
..ob*..
..bob*.

..bo*..
..obo*.
..bob.*

Вот и все, но это не заказано!

         def columns(test):
      results = set()
      for i in range(len(test)):
        tmp1=""
        tmp2=""
        for j in range(0,len(test)-i):
            tmp1+=test[i+j][j]
            tmp2+=test[j][i+j]
        results.add(tmp1)
        results.add(tmp2)
      return list(results) # if you need to return it like a list

Возвращаемое значение:

      ['ih', 'prxv', 'u', 't', 'bce', 'twx', 'rabbit', 'ayeot', 'wzig', 'uw', 'xqsvi']

Редактировать:

для "другой диагональной стороны":

      def columns(test):
    results = set()
    n=len(test)
    for i in range(n):
        tmp1=""
        tmp2=""
        for j in range(i+1):
            tmp1+=test[i-j][j]
            tmp2+=test[n-1-j][n-1-i+j]
        results.add(tmp1)
        results.add(tmp2)
    return list(results)

очень долгая и не очень эффективная реализация

      # your code goes here
def get_row_from_grid(l):
    """ take 2D matrix and give, diagonal elements"""

    return "".join([v2 for i, v in enumerate(l) for j, v2 in enumerate(v) if i == j])




l = [      ["r", "a", "w", "b", "i", "t"],
            ["x", "a", "y", "z", "c", "h"],
            ["p", "q", "b", "e", "i", "e"],
            ["t", "r", "s", "b", "o", "g"],
            ["u", "w", "x", "v", "i", "t"],
            ["u", "w", "x", "v", "i", "t"]]

val1, val2 = len(l)-1, 0
result = []

# traversing lower triangular matrix
for i in range(len(l)-1, -1, -1):
        tmp = get_row_from_grid([j[:len(l)-i] for j in l[i:]])
        result.append(tmp)

#  traversing upper triangluar matrix
for i in range(0, len(l)):
    tmp = get_row_from_grid( [ j[i+1:] for j in  l[:][i:]])
    if tmp:
        result.append(tmp)
print(result)

выход

      ['u', 'uw', 'twx', 'prxv', 'xqsvi', 'rabbit', 'ayeot', 'yeot', 'eot', 'ot', 't']
Другие вопросы по тегам