Как рекурсивно вызвать функцию в python, чтобы отбросить каждый элемент списка вниз? - PullRequest
2 голосов
/ 03 марта 2020

Например, если мой исходный вложенный список имеет вид:

[[' ', 'Y', ' ', 'X'], 
 ['S', ' ', 'V', ' '],
 ['T', 'X', 'Y', 'S'], 
 ['X', ' ', 'X', 'Y']]

Я бы хотел, чтобы результат был:

[[' ', ' ', ' ', ' '], 
 ['S', ' ', 'V', 'X'], 
 ['T', 'Y', 'Y', 'S'], 
 ['X', 'X', 'X', 'Y']]

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

Вот то, что я имею до сих пор. Мой результат дает мне то, что неверно.

[[' ', ' ', ' ', ' '],
 ['S', 'Y', 'V', 'X'],
 ['T', ' ', 'Y', 'S'],
 ['X', 'X', 'X', 'Y']]
def find_letters(m,constant):

    try:

        for i in range(len(m[constant])):
            if m[constant][i] == ' ':

                if m[constant - 1][i] != ' ':
                    m[constant][i] = m[constant - 1][i]
                    m[constant - 1][i] = ' '

        find_letters(m,constant - 1)   

    except IndexError:

        pass  



l = [[' ', 'Y', ' ', 'X'],
     ['S', ' ', 'V', ' '],
     ['T', 'X', 'Y', 'S'],
     ['X', ' ', 'X', 'Y']]
constant = -1   

(find_letters(l,constant))

Ответы [ 3 ]

4 голосов
/ 03 марта 2020

Вы можете попробовать это.

Вам нужно набрать sh все ' ' вверх в каждом столбце и расположить все остальные символы в порядке убывания. Вы можете использовать sorted() здесь.

a=[[' ', 'Y', ' ', 'X'],
   ['S', ' ', 'V', ' '],
   ['T', 'X', 'Y', 'S'],
   ['X', ' ', 'X', 'Y']]

out=list(zip(*[sorted(lst,key=lambda x: x==' ',reverse=True) for lst in zip(*a)]))
''' [(' ', ' ', ' ', ' '),
   ('S', ' ', 'V', 'X'),
   ('T', 'Y', 'Y', 'S'),
   ('X', 'X', 'X', 'Y')]'''
0 голосов
/ 03 марта 2020

Вместо сортировки вы можете фильтровать и дополнять списки с помощью ' ' спереди:

d = [[' ', 'Y', ' ', 'X'], ['S', ' ', 'V', ' '], ['T', 'X', 'Y', 'S'], ['X', ' ', 'X', 'Y']]
r = list(zip(*[[' ']*(len(d[0])-len(x))+x for k in zip(*d) if (x:=[j for j in k if j != ' '])]))

Вывод:

[(' ', ' ', ' ', ' ')
 ('S', ' ', 'V', 'X')
 ('T', 'Y', 'Y', 'S')
 ('X', 'X', 'X', 'Y')]
0 голосов
/ 03 марта 2020

для более простой работы со столбцами, которые можно использовать np.arrays с np.apply_along_axis функция:

m = np.array([[' ', 'Y', ' ', 'X'], 
 ['S', ' ', 'V', ' '],
 ['T', 'X', 'Y', 'S'], 
 ['X', ' ', 'X', 'Y']])

np.apply_along_axis(lambda c: [' '] *  list(c).count(' ') + [e for e in c if e != ' '],0 ,m)

вывод:

array([[' ', ' ', ' ', ' '],
       ['S', ' ', 'V', 'X'],
       ['T', 'Y', 'Y', 'S'],
       ['X', 'X', 'X', 'Y']], dtype='<U1')

если вы хотите python список списков, вы можете использовать ndarray.tolist () функция:

np.apply_along_axis(lambda c: [' '] *  list(c).count(' ') + [e for e in c if e != ' '],0 ,m).tolist()

вывод:

[[' ', ' ', ' ', ' '],
 ['S', ' ', 'V', 'X'],
 ['T', 'Y', 'Y', 'S'],
 ['X', 'X', 'X', 'Y']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...