[PYTHON] Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")

introduction

Essayons de frapper 100 langages naturels populaires dans la rue avec Python. Je pense qu'il existe différentes façons de le résoudre, alors j'aimerais vous montrer différentes façons de le résoudre. Bien entendu, il n'est pas possible de couvrir toutes les solutions. Si vous avez des questions telles que "Il existe une telle solution" ou "Je me trompe ici", veuillez me le faire savoir dans les commentaires.

Qu'est-ce que 100 Language Processing Knock 2020?

Language processing 100 knock 2020 est Inui Suzuki Laboratory /) Il s'agit du matériel pédagogique utilisé dans le Groupe d'étude de la recherche fondamentale en programmation. Pour plus de détails, reportez-vous à Environ 100 coups de traitement de la langue.

Lien vers l'article Qiita

1ère question 2ème question 3e question 4e question 5ème question 6ème question 7ème question 8ème question 9ème question 10e question
Chapitre 1 00 01 02 03 04 05 06 07 08 09
Chapitre 2 10 11 12 13 14 15 16 17 18 19
chapitre 3 20 21 22 23 24 25 26 27 28 29
Chapitre 4 30 31 32 33 34 35 36 37 38 39
Chapitre 5 40 41 42 43 44 45 46 47 48 49
Chapitre 6 50 51 52 53 54 55 56 57 58 59
Chapitre 7 60 61 62 63 64 65 66 67 68 69
Chapitre 8 70 71 72 73 74 75 76 77 78 79
Chapitre 9 80 81 82 83 84 85 86 87 88 89
Chapitre 10 90 91 92 93 94 95 96 97 98 99

01. «Patatokukashi»

problème

[01. "Patatokukashi"](https://nlp100.github.io/ja/ch01.html#01-%E3%83%91%E3%82%BF%E3%83%88%E3%82%AF Le problème de% E3% 82% AB% E3% 82% B7% E3% 83% BC% E3% 83% BC) est le suivant.

1 de la chaîne de caractères "Patatokukashi",3,5,Retirez le 7ème caractère et obtenez la chaîne de caractères concaténée.

répondre

Si vous lisez la question, la réponse est «Pattocar» car c'est le 1,3,5,7e caractère de «Patatokukasi». Toutes les réponses ci-dessous renverront «Patrol Car» lorsque la dernière expression sera évaluée.

Facile

Il existe une méthode pour l'ajouter docilement à la fin de la chaîne de caractères. ʻEnumerate (s) est un itérateur pour scanner (0, s [0]), ..., (n-1, s [n-1]) avec n = len (s) ` Retour.

#Facile
s = "Patatoku Kashii"

result = ""
for n,c in enumerate(s):
    if n%2==0:
        result += c
result #=> 'Voiture Pat'

Fonctionnel

Vous pouvez également écrire en utilisant map ou filter dérivé du type de fonction. Vous ne pouvez pas vraiment ressentir les avantages de cet exemple ...

#Fonctionnel
s = "Patatoku Kashii"

"".join(
    map(
        lambda x:x[1],
        filter(
            lambda x:x[0]%2==0,
            enumerate(s)
        )
    )
) #=> 'Voiture Pat'

Est-il légèrement préférable de nommer la fonction définie dans l'expression lambda?

#Fonctionnel
s = "Patatoku Kashii"

second_elem = lambda x:x[1]
is_first_elem_even = lambda x:x[0]%2==0

"".join(map(
        second_elem,
        filter(
            is_first_elem_even,
            enumerate(s)
        )
    )
) #=> 'Voiture Pat'

C'est exagéré si vous lui donnez trop de nom.

#Fonctionnel
s = "Patatoku Kashii"

first_elem = lambda x:x[0]
second_elem = lambda x:x[1]
is_first_elem_even = lambda x:first_elem(x)%2==0

"".join(map(
        second_elem,
        filter(
            is_first_elem_even,
            enumerate(s)
        )
    )
) #=> 'Voiture Pat'

J'espère qu'une telle fonction est préparée. La définition de fonction par l'expression lambda est la même que la définition de fonction normale ci-dessous.

def first_elem(x):
    return x[0]

def second_elem(x):
    return x[1]

def is_first_elem_even(x):
    return first_elem(x)%2==0

Il peut être préférable de le mettre discrètement dans une variable. Puisque filter et map renvoient un itérateur (générateur), la liste n'est pas générée à chaque fois que vous la placez dans une variable. Je n'ai pas l'impression que le rappel devrait être à l'arrière comme JavaScript.

#Fonctionnel
s = "Patatoku Kashii"

first_elem = lambda x:x[0]
second_elem = lambda x:x[1]
is_first_elem_even = lambda x:first_elem(x)%2==0

filtered = filter(is_first_elem_even, enumerate(s))
mapped = map(second_elem, filtered)
"".join(mapped) #=> 'Voiture Pat'

Notation d'inclusion

Il est plus facile d'écrire dans la notation d'inclusion sans s'en tenir à map et filter. Ecrire «[x pour x dans l]» est une notation d'inclusion de liste, et écrire «(x pour x dans l)» est une notation d'inclusion de générateur. f ((x pour x dans l)) peut être écrit avec f (x pour x dans l) et une parenthèse de moins. Assigner des valeurs à plusieurs variables en même temps est plus facile à comprendre que de les recevoir avec x et de les récupérer avec x [0] ʻou x [1]`.

#Notation d'inclusion
s = "Patatoku Kashii"

"".join(c for n,c in enumerate(s) if n%2==0) #=> 'Voiture Pat'

Pythonic

Être semblable à Python s'appelle ** Pythonic **, mais ce code est-il le plus pythonique? La méthode d'accès à une liste ou à une chaîne de caractères avec s [début: fin: étape] est appelée découpage. Si vous spécifiez «2» pour «step», il sera ignoré par un.

# Pythonic
s = "Patatoku Kashii"

s[::2] #=> 'Voiture Pat'

Autres réponses

Tour par index

Il existe également un moyen de préparer un index vous-même et de le faire pivoter sans utiliser ʻenumerate`.

#Tournez par vous-même
s = "Patatoku Kashii"

result = ""
n = 0
for c in s:
    if n%2==0:
        result += c
    n += 1
result #=> 'Voiture Pat'

Ajouter à la liste et rejoindre plus tard

Résoudre 100 traitement de langue knock 2020 (01. Ordre inverse des chaînes de caractères) Vous pouvez l'ajouter à la liste et le combiner plus tard. Je peux le faire.

#Facile
s = "Patatoku Kashii"

l = []
for n, c in enumerate(s):
    if n%2==0:
        l.append(c)
"".join(l) #=> 'Voiture Pat'

Regarder en arrière

Vous vous demandez peut-être ce qui est le meilleur, "combiner des chaînes" ou "ajouter à la liste". Si vous gérez une liste d'objets généraux au lieu de caractères, vous l'ajouterez inévitablement à la liste, mais si le but est de générer une chaîne de caractères comme celle-ci, cela n'a pas d'importance. S'il devient plus gros et plus lent, arrêtez-vous et pensez-y.

#Facile
s = "Patatoku Kashii"

result = ""
for n,c in enumerate(s):
    if n%2==0:
        result += c
result #=> 'Voiture Pat'
#Facile
s = "Patatoku Kashii"

l = []
for n, c in enumerate(s):
    if n%2==0:
        l.append(c)
"".join(l) #=> 'Voiture Pat'

Recommended Posts

Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 2
100 coups en traitement du langage amateur: 47
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 coups de traitement du langage avec Python 2015
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
100 coups de traitement du langage amateur: Résumé
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 Language Processing Knock-55: extraction d'expressions uniques
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
Traitement du langage 100 knock-86: affichage vectoriel Word
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
100 Language Processing Knock-28: Suppression du balisage MediaWiki
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 traitement du langage knock-59: analyse de la formule S
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
100 traitement du langage knock-31 (en utilisant des pandas): verbe
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
100 traitement du langage knock-73 (en utilisant scikit-learn): apprentissage
100 Language Processing Knock Chapitre 1 par Python
100 Language Processing Knock 2020 Chapitre 3: Expressions régulières
100 langage traitement knock-24: Extraire la référence du fichier
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 2
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 4
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
100 coups de traitement linguistique (2020): 40