[PYTHON] Traitement de chemin avec take while et drop while

Si vous cherchez quelque chose, il existe une méthode comme find, vous ne pouvez pas l'utiliser comme filter, Je me demandais quand utiliser «take while» et «drop while»

Mais l'autre jour, j'ai senti que j'étais capable de bien l'utiliser (?) Alors je vais le lancer comme une petite histoire

Longue introduction

Un tel chemin est une chaîne de caractères

data/output/user/contract.csv

Je veux n'importe quelle partie

Laissez la partie (disons base) et la partie de ʻuser (disons dir) jusqu'à ʻoutput

Pour le moment, cela a fonctionné avec cette implémentation

def base = path.split('/')[0..1].join('/') // data/output
def dir = path.split('/')[2]               // user

Je veux couper davantage le répertoire!

data/ver1.0/output/user/contract.csv

Hmm ... j'ai changé les indices ...

def base = path.split('/')[0..2].join('/') // data/ver1.0/output
def dir = path.split('/')[3]               // user

Écrivons le code de test de l'outil!

Ce sont les données factices utilisées dans le test!

test/data/ver1.0/output/user/contract.csv

i ... si devrait être utilisé ... haha ...

if (isTest) {
  def base = path.split('/')[0..3].join('/') // test/data/ver1.0/output
  def dir = path.split('/')[4]               // user

} else {
  def base = path.split('/')[0..2].join('/') // data/ver1.0/output
  def dir = path.split('/')[3]               // user
}

Peu importe à quel point cette implémentation n'existe pas

C'est difficile à comprendre avec un accès en indice, et je ne supporte pas du tout les changements dans la structure des répertoires. De plus, changer l'indice avec un drapeau est une science-fiction!

Alors prenez-en compte / laissez tomber!

Si vous voulez jusqu'à ... / output, prenez un moment, Si vous voulez la prochaine sortie ʻafter, laissez tomber, c'était bien!

def base = path.split('/').takeWhile {it != 'output'}.join('/').concat('/output') // data/ver1.0/output
def dir = path.split('/').dropWhile {it != 'output'}[1]                           // user

Si tel est le cas, il peut être géré automatiquement de manière flexible dans une certaine mesure (bien que la configuration sous ʻoutputne change pas pour des raisons de conception d'outil). Même ainsi, j'ai en fait écrittake while pour la première fois, mais cela n'inclut pas output` ... Je suis un peu déçu là-bas ...

prime

Groovy Facile à écrire, comme dans l'exemple La chaîne de méthodes est facile à lire et il est facile d'écrire des fonctions anonymes.

Python

path = 'data/ver1.0/output/user/contract.csv'

import itertools

taken_iter = itertools.takewhile(lambda x: x != 'output', path.split('/'))
print '/'.join(list(taken_iter)) + '/output' # data/ver1.0/output

dropped_iter = itertools.dropwhile(lambda x: x != 'output', path.split('/'))
print list(dropped_iter)[1]                  # user

J'aime Python, mais je suis un peu déçu ... Puisque xxx while importe et appelle la méthode, vous devez appliquer list () ou join () au résultat. Si vous l'écrivez sur une seule ligne, ce sera ....)))) Les fonctions anonymes sont également un peu plus difficiles à lire que Groovy et Scala, et il est difficile de comprendre ce qu'elles font dans l'ensemble, donc je suis désolé!

Haskell

import Data.List
import Data.List.Split

main = do
    let path = "data/ver1.0/output/user/contract.csv"

    print $ (intercalate "/"  $ (takeWhile (/= "output") $ splitOn "/" path)) ++ "/output"
    print $ (dropWhile (/= "output") $ splitOn "/" path) !! 1

Parce qu'il y a beaucoup de choses à faire, il y aura beaucoup de (...) ... De plus, cela n'a rien à voir avec le sujet principal, mais pourquoi ne pas l'utiliser sans installer splitOn! Je l'utilise assez souvent!

Haskell2

import Data.List
import Data.List.Split

main = do
    let path = "data/ver1.0/output/user/contract.csv"

    let reversed = reverse $ splitOn "/" path
    print $ intercalate "/" $ reverse $ dropWhile (/= "output") reversed
    print $ last $ takeWhile (/= "output") $ reversed

Si c'est takeWhile, l'essentiel «sortie» n'est pas inclus dans le résultat, j'ai donc essayé d'inverser les éléments Est-ce rafraîchissant?

J'ai aussi pensé à PHP, mais cela ne semblait pas faire de différence notable, alors je l'ai omis. Java semble gênant (biaisé), donc je l'ai rejeté. Il est bon de connaître diverses fonctions en écrivant dans différentes langues!

Pourquoi est-ce toujours plus long avec juste cette petite histoire ... Mais ce n'est pas bon de dire la commodité!

De plus, il n'y a aucune opinion selon laquelle "chemin sous forme de chaîne de caractères" devrait être divisé par "sortie"!

Recommended Posts

Traitement de chemin avec take while et drop while
Traitement d'image avec MyHDL
Traitement des ensembles de données avec des pandas (2)
Remarques sur le traitement d'images HDR et RAW avec Python
Traitement d'image avec Python
Traitement parallèle avec multitraitement
Traitement FFT avec filtre numpy et scipy vers passe-bas
Avec et sans WSGI
Traitement d'image avec PIL
[Jouons avec Python] Traitement d'image en monochrome et points
Avec moi, cp et sous-processus
Traitement d'image avec Python (partie 2)
Programmation avec Python et Tkinter
100 coups de traitement du langage avec Python 2015
Chiffrement et déchiffrement avec Python
Travailler avec le tkinter et la souris
Traitement parallèle avec des fonctions locales
Traitement d'image avec PIL (Pillow)
"Traitement Apple" avec OpenCV3 + Python3
Python et matériel - Utilisation de RS232C avec Python -
Traitement du signal acoustique avec Python (2)
Traitement du signal acoustique avec Python
100 coups sur le traitement d'image !! (001 --010) Soigneusement et soigneusement
Traitement parallèle avec Parallel de scikit-learn
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Super résolution avec SRGAN et ESRGAN
Group_by avec sqlalchemy et sum
python avec pyenv et venv
Traitement de l'expansion et de la contraction de l'image
Conseils de traitement des données avec Pandas
Avec moi, NER et Flair
Fonctionne avec Python et R
[Python] Traitement d'image avec scicit-image
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
J'ai essayé l'expression des nombres naturels et le traitement arithmétique uniquement avec le traitement de liste