Formation I.S.N.

Désimbriquer

Exercice : désemboîter les matriochkas

On dispose d'une liste contenant des entiers ou des listes d'entiers, ou des listes de listes d'entiers ou des listes de listes de listes d'entiers ou ...

Par exemple : L = [3, [2,3,[4,5,6], [2,[3,5]] ] , 8, [[[[ 4, [1] ]]]], 15 ].

L'objectif est d' "aplanir" ces listes afin qu'elles ne contiennent plus que les entiers terminaux.

La liste précédente doit par exemple devenir : L = [3,2,3,4,5,6,2,3,5,8,4,1,15].

Écrire une fonction python récursive accomplissant cette tâche.

  • un code python
  • un autre code

Une solution Python :


def aplanir(L, Acc = [] ) :
	if L == [] : return Acc
	else :
		x = L.pop(0)
		if isinstance(x, list) : aplanir(x,Acc)
		else : Acc.append(x)
		return aplanir(L, Acc)


print(aplanir([2,3,4,[2,5, [4,7], 8], [2,[[[7]]]], [] ])) 

ou encore :


def aplanir(L):
    if isinstance(L, list):
        return [a for M in L for a in aplanir(M)]
    else:
        return [L]
        
        
 

print(aplanir([2,3,4,[2,5, [4,7], 8], [2,[[[7]]]], [] ])) 

Une solution Python :


def aplanir(L) :
	
	def decapsule(liste):
		for x in liste:
			try : yield from decapsule(x)
			except TypeError : yield x
			
	return list(decapsule(L))      
      
 
L = [2,3,4,[2,5, [4,7], 8], [2,[[[7]]]], [] ]
print( aplanir(L) )