La fonction natsorted () ne peut pas être appliquée aux listes avec des éléments sous la forme pathlib.Path. Par conséquent, j'ai créé ma propre fonction de tri dans l'ordre naturel.
La fonction sorted () est une fonction qui trie les éléments d'une liste dans l'ordre lexical. Par exemple, lorsqu'il existe une telle liste
strs = ["dir/10", "dir/1", "dir/3" , "dir/24"]
Si tu écris comme ça,
for s in sorted(strs):
print(s)
Ça devient comme ça.
dir/1
dir/10
dir/24
dir/3
C'est dans l'ordre lexical, donc c'est raisonnable, mais c'est un peu désagréable pour les humains.
D'autre part, la fonction natsorted () est une fonction qui trie les éléments de la liste dans l'ordre naturel (nécessite un module). Si vous écrivez comme ça pour la même liste,
from natsort import natsorted
for s in natsorted(strs):
print(s)
Ça devient comme ça.
dir/1
dir/3
dir/10
dir/24
Celui-ci va bien. La meilleure fonction natsorted ()!
Par exemple, dans la structure de répertoires suivante
dir
├ 1
├ 3
├ 10
└ 24
De cette façon, vous pouvez créer une liste au format pathlib.Path. Si vous recherchez le module pathlib, vous trouverez de nombreuses explications, je vais donc l'omettre.
import pathlib
paths = [p for p in pathlib.Path("./dir/").iterdir() if p.is_dir()]
Ensuite, si vous triez ceci dans l'ordre naturel,
from natsort import natsorted
for p in natsorted(paths):
print(p)
Ça devient comme ça.
dir\1
dir\10
dir\24
dir\3
** C'est dans l'ordre du dictionnaire! ** ** Eh bien, je suis sûr qu'il ne prend pas en charge le format Path. Donc, si vous le lisez dans l'ordre lexical et c'est juste cela. Cela signifie-t-il que l'élément doit être str ou int (je ne comprends pas bien ce domaine. Je veux des informations).
J'ai fait une telle fonction par moi-même. La fonction sorted () utilise le fait que la clé peut être spécifiée comme argument.
def paths_sorted(paths):
return sorted(paths, key = lambda x: int(x.name))
Si vous utilisez ceci comme ça,
for p in paths_sorted(paths):
print(p)
Ça devient comme ça.
dir\1
dir\3
dir\10
dir\24
Le résultat souhaité a été obtenu.
Dans mon cas, le nom du répertoire était une valeur numérique, j'ai donc converti le nom du répertoire en int et l'ai utilisé comme clé. Si vous souhaitez inclure une chaîne de caractères comme no1, no2 ..., vous pouvez utiliser natsorted () comme str (bien que vous ayez besoin d'un module). La même méthode devrait s'appliquer aux fichiers plutôt qu'aux répertoires.
Recommended Posts