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.
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.
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"](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.
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.
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'
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'
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'
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'
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'
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