2 votes

Comment appeler récursivement une fonction en python pour déposer chaque élément d'une liste au bas de celle-ci ?

Par exemple, si ma liste imbriquée d'origine est :

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

J'aimerais que le résultat soit le suivant :

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

Il s'agit donc de faire descendre toutes les lettres vers le bas sans supprimer les espaces et en conservant la structure de la liste.

Voici ce que j'ai pour l'instant. Mon résultat me donne ceci qui est incorrect.

[[' ', ' ', ' ', ' '],
 ['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))

4voto

Ch3steR Points 15182

Vous pouvez essayer ceci.

Vous devez pousser tous les ' ' vers le haut dans chaque colonne, et les autres caractères vers le bas, en conservant l'ordre. Vous pouvez utiliser sorted() ici.

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')]'''

0voto

kederrac Points 15339

Pour opérer plus simplement sur les colonnes, vous pouvez utiliser np.arrays avec np.apply_along_axis fonction :

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)

de la production :

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

Si vous voulez une liste de listes en python, vous pouvez utiliser ndarray.tolist() fonction :

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

de la production :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X