Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren

So was

a, b, c = "hello 3.14 0".split()
b = float(b)
c = int(c)

Es ist ein Ärger, also möchte ich einen Weg finden, es auf einmal zu tun ... Vielleicht erfindet es jeder neu, oder?

@odashi_t auf Twitter

Der Vorgang, Zeilen mit Python zu lesen, sie durch Leerzeichen zu trennen und Werte für jede Variable immer zu lesen a,b,c,d,e,... = line.split() Danach habe ich jeden konvertiert, aber gibt es eine einfache Möglichkeit, ihn zu schreiben?

Ich brauche nichts so Anspruchsvolles wie einen regulären Ausdruck a,b,c,d,e = split_and_convert(line, (int, float, str, str, int)) Ich würde mich freuen, wenn ich so etwas wie> schreiben könnte.

Ich wollte auch Ihren intelligenten Weg kennen, also werde ich den veröffentlichen, den ich benutze

def map_apply(proc, args):
    # return [f(x) for f, x in zip(proc, args)]
    return map(lambda f,x:f(x), proc, args)  # map(apply, proc, args) doesn't work like this

class FieldConverter:
    def __init__(self, *args):
        self._converters = args
        def conv_proc(f):
            def _wrap(conv_proc_to_num):
                def proc(x):
                    try:
                        return conv_proc_to_num(x)
                    except ValueError:
                        return 0
                return proc
            if f is None:
                return lambda s:s  # identity
            elif isinstance(f, str):
                return lambda s:s.decode(f)  # -> unicode
            elif f in (int, float):
                return _wrap(f)
            else:
                return f
        if len(args) > 0:
            self.converters = [conv_proc(f) for f in self._converters]
        else:
            self.converters = None

    def convert(self, fields):
        if self.converters:
            return map_apply(self.converters, fields)
        else:
            return fields


def test_map_apply():
    assert [0, -1, 3.14, 5.0] == map_apply([int,int,float,float], ['0','-1','3.14','5'])
    assert [0,u'japanisch','japanisch'] == map_apply([int,lambda s:s.decode('utf-8'),lambda s:s], ['0','japanisch','japanisch'])

def test_field_converter():
    assert [0, -1, 3.14, 5.0] == FieldConverter(int,int,float,float).convert(['0','-1','3.14','5'])
    assert [0,u'japanisch','japanisch'] == FieldConverter(int,'utf-8',None).convert(['0','japanisch','japanisch'])

Ich brauche keine Erklärung für int und float. Wenn Sie so etwas wie 'utf-8' machen, wird es von UTF-8 dekodiert und in Unicode konvertiert. Keine ist keine Konvertierung Sie können jede Funktion mit einer Variablen (sogar Lambda) übergeben.

@ odashi_ts split_and_convert ()

def split_and_convert(line, types, delim=' '):
    field_converter = FieldConverter(*types)
    return field_converter.convert(line.split(delim))

def test_split_and_convert():
    assert [0, -1, 3.14, 5.0] == split_and_convert('0\t-1\t3.14\t5', (int,int,float,float), '\t')
    assert [0, u'japanisch', 'japanisch'] == split_and_convert('0,japanisch,japanisch', (int,'utf-8',None), ',')

Ich frage mich, ob es so implementiert werden kann. Ich möchte field_converter zwischenspeichern.

Wenn die Konvertierung nur int oder float ist

def split_and_convert(line, types, delim=' '):
    return [f(x) for f,x in zip(types, line.split(delim))]

Es ist aber okay.

Wenn das so ist

a, b, c, d = split_and_convert('0\t-1\t3.14\t5', (int,int,float,float), '\t')

Kann wie verwendet werden. (A = 0, b = -1, t = 3,14, d = 5,0)

Vorerst werde ich den Code auf den Punkt bringen https://gist.github.com/naoyat/3db8cd96c8dcecb5caea

Recommended Posts

Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte das Ausführungsergebnis von strace erfassen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte R-Datensatz mit Python verwenden
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
Ich möchte die Natur von Python und Pip kennenlernen
Das Ergebnis der Installation von Python auf Anaconda
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Ich möchte Dunnetts Test in Python machen
Ich möchte mit Python ein Fenster erstellen
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen
[Einführung in Python] Eine ausführliche Erklärung der in Python verwendeten Zeichenkettentypen!
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich möchte das Erscheinungsbild von zabbix anpassen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Was Sie sich mit der grundlegenden Grammatik "String Manipulation" von Python merken möchten
Ich möchte das Bild entlang der Kontur anstelle des Rechtecks zuschneiden [Python OpenCV]
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Ich möchte Timeout einfach in Python implementieren
So ermitteln Sie die Anzahl der Stellen in Python
Auch mit JavaScript möchte ich Python `range ()` sehen!
Konvertieren Sie das Bild in .zip mit Python in PDF
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine Zeichenkette mit Hiragana teilen
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Ich möchte am Ende etwas mit Python machen
Ich möchte Strings in Kotlin wie Python manipulieren!
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
[Python] Datum in Zeichenfolge konvertieren
<Python> Ein Quiz zum Batch-Konvertieren von Dateinamen, die durch eine bestimmte Zeichenfolge als Teil des Dateinamens getrennt sind
Ich möchte nur das 95% -Konfidenzintervall des Unterschieds im Bevölkerungsverhältnis in Python ermitteln
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
Ich habe Python verwendet, um mich über die Rollenauswahl der 51 "Yachten" in der Welt zu informieren.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich möchte eine andere Version von Python mit pyvenv angeben
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.