[Python] Trier la liste de pathlib.Path dans l'ordre naturel

Aperçu

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.

fonctions sorted () et natsorted ()

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 ()!

Que se passe-t-il si Path est un élément

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).

Solution

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.

Autre

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

[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Copiez la liste en Python
[python] Récupère la liste des classes définies dans le module
[Python] Affiche toutes les combinaisons d'éléments de la liste
À propos de la liste de base des bases de Python
En Python, les éléments de la liste sont triés et sortis sous forme d'éléments et de multiples.
Implémentation de l'algorithme de "Algorithm Picture Book" en Python3 (Bubble Sort)
Obtenez le nombre d'éléments spécifiques dans la liste python
Implémentation de l'algorithme «Algorithm Picture Book» en Python3 (tri sélectif)
Trier la liste des tuples en Python en spécifiant l'ordre croissant / décroissant de plusieurs clés
Vérifiez le comportement du destroyer en Python
Afficher une liste d'alphabets en Python 3
Prenez la somme logique de List en Python (fonction zip)
Le résultat de l'installation de python sur Anaconda
Principes de base pour exécuter NoxPlayer en Python
Résumé des méthodes intégrées, etc. de la liste Python
À la recherche du FizzBuzz le plus rapide en Python
Obtenir la liste de codes EDINET en Python
[python] Obtenez le rang des valeurs dans la liste par ordre croissant / décroissant
Liste triée en Python
Liste des modules python
Sortie du nombre de cœurs de processeur en Python
[python] Vérifier les éléments de la liste tous, tous
Tri à bulles en Python
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Liste de filtres en Python
Afficher le résultat du traitement de la géométrie en Python
le zen de Python
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Découvrez la fraction de la valeur saisie en python
[Mémo] Tri de liste Python3
Je souhaite trier une liste dans l'ordre des autres listes
La chose semblable à une recherche de liste en Python
Trouvez la solution de l'équation d'ordre n avec python
Recevez une liste des résultats du traitement parallèle en Python avec starmap
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Tri personnalisé en Python3
Sortie sous la forme d'un tableau python
Rechercher par la valeur de l'instance dans la liste
Trier les éléments de la liste dans l'ordre spécifié en Python
Ordre naturel en Python
[Python] Manipulation d'éléments dans une liste (tableau) [Trier]
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
traitement (python) Diagramme les coordonnées de la liste Spécifiez le nombre de fois dans draw ()
Comment obtenir une liste de fichiers dans le même répertoire avec python
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Trier en Python. Pensons ensuite à l'algorithme.
Comment obtenir le nombre de chiffres en Python
Résumé du tri Python (liste, type de dictionnaire, série, DataFrame)
[Python] Manipulation des éléments dans la liste (tableau) [Ajouter / Supprimer]
L'histoire de FileNotFound en Python open () mode = 'w'
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Implémenter la solution de l'algèbre de Riccati en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Ne pas être conscient du contenu des données en python
Liste du code Python utilisé dans l'analyse de Big Data
[Python] Obtenir la liste des noms ExifTags de la bibliothèque Pillow