[PYTHON] Pfadverarbeitung mit takewhile und dropwhile

Wenn Sie nach etwas suchen, gibt es eine Methode wie "finden", Sie können sie nicht wie "filtern" verwenden. Ich habe mich gefragt, wann ich "takewhile" und "dropwhile" verwenden soll

Aber neulich hatte ich das Gefühl, ich könnte es gut gebrauchen (?) Also werde ich es als kleine Geschichte werfen

Lange Einführung

Ein solcher Pfad ist eine Zeichenfolge

data/output/user/contract.csv

Ich will irgendeinen Teil

Lassen Sie den Teil von "bis zu" (sagen wir Basis) und den Teil von "Benutzer" (sagen wir dir)

Vorerst hat es mit dieser Implementierung funktioniert

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

Ich möchte das Verzeichnis mehr schneiden!

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

Hmm ... ich habe die Indizes verschoben ...

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

Schreiben wir den Testcode für das Tool!

Dies sind die im Test verwendeten Dummy-Daten!

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

ich ... wenn sollte verwendet werden ... 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
}

Egal wie viel diese Implementierung nicht existiert

Mit tiefgestelltem Zugriff ist es schwer zu verstehen, und ich kann Änderungen in der Verzeichnisstruktur überhaupt nicht ertragen. Darüber hinaus ist das Ändern des Index mit einer Flagge eine Science-Fiction!

Also nehmen / fallen lassen!

Wenn Sie bis zu "... / output" möchten, nehmen Sie sich Zeit, Wenn Sie das "neben dem Ausgang" wollen, war Dropwhile in Ordnung!

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

Wenn dies der Fall ist, kann es bis zu einem gewissen Grad flexibel automatisch gehandhabt werden (obwohl sich die Konfiguration unter "Ausgabe" aus Gründen des Werkzeugdesigns nicht ändert). Trotzdem habe ich zum ersten Mal "takewhile" geschrieben, aber es enthält keine "Ausgabe" ... Ich bin dort ein wenig enttäuscht ...

Bonus

Groovy Einfach zu schreiben, wie im Beispiel Die Methodenkette ist leicht zu lesen und anonyme Funktionen zu schreiben.

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

Ich mag Python, aber ich bin ein bisschen enttäuscht ... Da xxxwhile die Methode importiert und aufruft, müssen Sie "list ()" oder "join ()" auf das Ergebnis anwenden. Wenn Sie es in eine Zeile schreiben, wird es "....))))" sein Anonyme Funktionen sind auch etwas schwieriger zu lesen als Groovy und Scala, und es ist schwer zu verstehen, was sie insgesamt tun. Es tut mir leid!

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

Da es viele Dinge zu tun gibt, wird es viele "(...)" geben ... Es hat auch nichts mit dem Hauptthema zu tun, aber warum nicht ohne Installation von splitOn! Ich benutze es ziemlich oft!

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

Bei takeWhile ist die wesentliche "Ausgabe" nicht im Ergebnis enthalten, daher habe ich versucht, die Elemente umzukehren Ist es erfrischend?

Ich habe auch über PHP nachgedacht, aber es schien keinen merklichen Unterschied zu machen, also habe ich es weggelassen. Java scheint problematisch (voreingenommen) zu sein, also habe ich es abgelehnt. Es ist gut, verschiedene Funktionen zu kennen, indem man in verschiedenen Sprachen schreibt!

Warum wird es mit dieser kleinen Geschichte immer länger ... Aber es ist nicht gut, Bequemlichkeit zu vermitteln!

Es gibt auch keine Meinung, dass "Pfad als Zeichenfolge" durch "Ausgabe" geteilt werden sollte!

Recommended Posts

Pfadverarbeitung mit takewhile und dropwhile
Bildverarbeitung mit MyHDL
Datensätze mit Pandas verarbeiten (2)
Hinweise zur HDR- und RAW-Bildverarbeitung mit Python
Bildverarbeitung mit Python
Parallelverarbeitung mit Mehrfachverarbeitung
FFT-Verarbeitung mit numpy und scipy bis Tiefpassfilter
Mit und ohne WSGI
Bildverarbeitung mit PIL
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
Bei mir cp und Subprocess
Bildverarbeitung mit Python (Teil 2)
Programmieren mit Python und Tkinter
100 Sprachverarbeitungsklopfen mit Python 2015
Ver- und Entschlüsselung mit Python
Arbeiten Sie mit tkinter und Maus
Parallelverarbeitung mit lokalen Funktionen
Bildverarbeitung mit PIL (Pillow)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Python und Hardware-Verwenden von RS232C mit Python-
Akustische Signalverarbeitung mit Python (2)
100 Klopfen bei der Bildverarbeitung !! (001 - 010) Vorsichtig und vorsichtig
Parallele Verarbeitung mit Parallel von Scikit-Learn
Bildverarbeitung mit Python (Teil 1)
Bildverarbeitung mit Python (3)
Super Auflösung mit SRGAN und ESRGAN
Group_by mit sqlalchemy und sum
Python mit Pyenv und Venv
Bildausdehnung und Kontraktionsverarbeitung
Datenverarbeitungstipps mit Pandas
Mit mir, NER und Flair
Funktioniert mit Python und R.
[Python] Bildverarbeitung mit Scicit-Image
Geschwindigkeitsvergleich der Volltextverarbeitung von Wiktionary mit F # und Python
Ich habe versucht, natürliche Zahlenausdrücke und arithmetische Verarbeitung nur mit Listenverarbeitung