Как лучше всего найти диагонали сетки?
Итак, я пытаюсь найти диагонали на сетке. Я пробовал смотреть на некоторые страницы переполнения стека, которые, казалось, давали подсказку, но большинство из них включает 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']