Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python

Comme ça

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

C'est un problème, alors je veux un moyen de le faire en un seul coup ... Peut-être que tout le monde le réinvente, non?

@odashi_t sur Twitter

Le processus de lecture des lignes en Python, de les séparer par des espaces et de lire les valeurs dans chaque variable, toujours a,b,c,d,e,... = line.split() Après cela, j'ai converti chacun d'eux, mais y a-t-il un moyen facile de l'écrire?

Je n'ai besoin de rien d'aussi sophistiqué qu'une expression régulière, alors a,b,c,d,e = split_and_convert(line, (int, float, str, str, int)) Je serais heureux si je pouvais écrire quelque chose comme>.

Je voulais aussi connaître votre manière intelligente, je publierai donc celle que j'utilise

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'Japonais','Japonais'] == map_apply([int,lambda s:s.decode('utf-8'),lambda s:s], ['0','Japonais','Japonais'])

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'Japonais','Japonais'] == FieldConverter(int,'utf-8',None).convert(['0','Japonais','Japonais'])

Je n'ai pas besoin d'expliquer int et float. Si vous faites quelque chose comme «utf-8», il sera décodé par UTF-8 et converti en unicode. Aucun n'est pas de conversion Vous pouvez passer n'importe quelle fonction à une variable (même lambda).

split_and_convert () de @ odashi_t

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'Japonais', 'Japonais'] == split_and_convert('0,Japonais,Japonais', (int,'utf-8',None), ',')

Je me demande si cela peut être implémenté comme ça. Je veux mettre en cache field_converter.

Si la conversion est simplement int ou float

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

Ça va cependant.

Si ce

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

Peut être utilisé comme. (A = 0, b = -1, t = 3,14, d = 5,0)

Pour le moment, je vais mettre le code sur l'essentiel https://gist.github.com/naoyat/3db8cd96c8dcecb5caea

Recommended Posts

Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux afficher la progression en Python!
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
Je veux colorer une partie de la chaîne Excel avec Python
Je souhaite intégrer une variable dans une chaîne Python
Je veux grep le résultat de l'exécution de strace
Je veux écrire en Python! (3) Utiliser des simulacres
Je veux utiliser le jeu de données R avec python
J'ai essayé de résumer les opérations de chaîne de Python
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
Je souhaite stocker les résultats de% time, %% time, etc. dans un objet (variable)
Je veux connaître la nature de Python et pip
Le résultat de l'installation de python sur Anaconda
Convertissez le résultat de python optparse en dict et utilisez-le
Je veux connaître la population de chaque pays du monde.
Je veux faire le test de Dunnett en Python
Je veux créer une fenêtre avec Python
Je souhaite extraire une URL arbitraire de la chaîne de caractères de la source html avec python
Afficher le résultat du traitement de la géométrie en Python
Je souhaite convertir une table convertie en PDF en Python en CSV
Je veux fusionner des dictionnaires imbriqués en Python
Je souhaite trier une liste dans l'ordre des autres listes
Je souhaite laisser une commande arbitraire dans l'historique des commandes de Shell
[Introduction à Python] Une explication approfondie des types de chaînes de caractères utilisés dans Python!
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Je souhaite personnaliser l'apparence de zabbix
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS
Je souhaite voir une liste de fichiers WebDAV dans le module Requêtes
Ce que vous voulez mémoriser avec la grammaire de base de "manipulation de chaînes" de python
Je veux recadrer l'image le long du contour au lieu du rectangle [python OpenCV]
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
Je veux écrire en Python! (1) Vérification du format de code
J'ai essayé de représenter graphiquement les packages installés en Python
Comment convertir / restaurer une chaîne avec [] en python
Je veux facilement implémenter le délai d'expiration en python
Comment obtenir le nombre de chiffres en Python
Même avec JavaScript, je veux voir Python `range ()`!
Convertissez l'image au format .zip en PDF avec Python
Je veux hériter de l'arrière avec la classe de données python
Je veux bien comprendre les bases de Bokeh
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Je veux faire quelque chose avec Python à la fin
Je veux manipuler des chaînes dans Kotlin comme Python!
Je souhaite augmenter la sécurité de la connexion SSH
[python] Convertir la date en chaîne
<Python> Un quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique dans le cadre du nom de fichier
Je veux juste trouver l'intervalle de confiance à 95% de la différence de ratio de population en Python
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
J'ai utilisé Python pour découvrir les choix de rôle des 51 "Yachts" dans le monde.
J'ai essayé de trouver l'entropie de l'image avec python
Je veux initialiser si la valeur est vide (python)
Je souhaite spécifier une autre version de Python avec pyvenv
Découvrez la largeur apparente d'une chaîne en python
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.