Le comptage de la profondeur ou le niveau le plus profond, une liste imbriquée va à
Un ont un réel problème (et un mal de tête) avec une mission...
Je suis dans un cours d'introduction à la programmation de la classe, et je dois écrire une fonction qui, étant donné une liste, sera de retour le "maximum" de profondeur, il va à la...
Par exemple: [1,2,3] retourne 1, [1,[2,3]] sera de retour le 2...
J'ai écrit ce morceau de code (c'est le meilleur que j'ai pu obtenir T_T)
def flat(l):
count=0
for item in l:
if isinstance(item,list):
count+= flat(item)
return count+1
Cependant, Il est évident qu'elle se complique pas fonctionner comme il se doit, parce que si il y a des listes qui ne comptent pas pour le maximum de profondeur, il soulève encore le compteur...
Par exemple: lorsque j'utilise la fonction avec [1,2,[3,4],5,[6],7] il doit retourner 2, mais il renvoie 3...
Des idées ou de l'aide serait grandement appréciée ^^ merci beaucoup!! J'ai été strugling avec ce depuis des semaines...
- Je pense que le mot que vous voulez, c'est la "profondeur", pas de "profondeur".
- Comme une note de côté: découvrez la PEP-8. Ça va être bon pour former les habitudes tout de suite. Pour commencer, utilisez
L
pour une liste, pasl
(qui ressemble à1
). - Merci ^^ mon mal, je suppose que c'est assez clair que l'anglais n'est pas ma langue première 🙂
- C'est vraiment intéressant ^^ merci! Je ne savais pas que l'existence même d'un...
- +1 pour la prise clair que ce sont les devoirs et ensuite de poser la question de manière appropriée. La question est à la fois intéressant, et montre ce qui a été tenté jusqu'à présent.
Vous devez vous connecter pour publier un commentaire.
En largeur d'abord, sans la récursivité, et il travaille également avec d'autres types de séquences:
La même idée, mais avec beaucoup moins de consommation de mémoire:
depth(["a"])
va casserseq = chain.from_iterable(s for s in seq if isinstance(s, Sequence) and not isinstance(s, str))
et il travaillera également avec des éléments de chaîneIci est une façon d'écrire la fonction
Je pense que l'idée vous manque, c'est d'utiliser
max()
Nous allons tout d'abord reformuler vos exigences légèrement.
Maintenant, cela peut être traduits directement à code:
max
arg ce qui entraîne une erreur.facile avec la récursivité
Il l'a fait en une ligne de python 🙂
profiter de
Abusif de:
Dire que votre liste est appelée
mylist
mybrackets = map(lambda x: 1 if x=='[' else -1, [x for x in str(mylist) if x=='[' or x==']'])
maxdepth = max([sum(mybrackets[:i+1]) for i in range(len(mybrackets))])
Cela transforme votre liste à une liste d'ouverture et de fermeture crochets, puis trouve le plus grand nombre de l'ouverture des crochets qui se produisent avant que le correspondant crochet de fermeture se produit.
Une manière qui n'a pas besoin de modules supplémentaires et a la même vitesse, peu importe à quelle profondeur:
Fondamentalement, ce que cela fait, c'est de convertir la liste d'une chaîne à l'aide de
repr()
. Ensuite, pour chaque personnage dans cette chaîne égale à "(
" ou "[
" il augmente la variablecount
. pour la fermeture crochets, elle diminuecount
. Ensuite, il retourne la valeur maximale quecount
a atteint.J'ai étendu la hammar réponse pour chaque objet iterable (chaînes désactivée par défaut):
Un court plus de ce qui a été dit pour qu'il puisse gérer vide listes de trop:
@Jean solution est excellente, mais à l'adresse de la liste vide des cas, comme
[]
,[[]]
, vous devrez peut-être faire quelque chose comme cecidepth = lambda L: isinstance(L, list) and (max(map(depth, L)) + 1) if L else 1
Dans Numpy, vous pouvez convertir la structure de données pour un
numpy array
et d'utiliser ses fonctions de bibliothèque.arr.shape
donne la longueur de la couche, de sorte que nous pouvonslen()
la forme et obtenir la profondeur de la structure:Numpy docs pour la forme: https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html