Versuchen wir, 100 natürliche Sprachen anzuklopfen, die bei Python auf der Straße beliebt sind. Ich denke, es gibt verschiedene Möglichkeiten, es zu lösen, deshalb möchte ich Ihnen verschiedene Möglichkeiten zeigen, es zu lösen. Natürlich ist es nicht möglich, alle Lösungen abzudecken. Wenn Sie Fragen zu "Es gibt eine solche Lösung" oder "Das ist falsch" haben, teilen Sie uns dies bitte in den Kommentaren mit.
Sprachverarbeitung 100 Knock 2020 ist das Inui Suzuki Laboratory der Tohoku University. /) Dies ist das Lehrmaterial, das in der Studiengruppe Programmiergrundforschung verwendet wird. Weitere Informationen finden Sie unter Über 100 Sprachverarbeitungsklopfen.
1. Frage | 2. Frage | 3. Frage | 4. Frage | 5. Frage | 6. Frage | 7. Frage | 8. Frage | 9. Frage | 10. Frage | |
---|---|---|---|---|---|---|---|---|---|---|
Kapitel 1 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
Kapitel 2 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
Kapitel 3 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
Kapitel 4 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
Kapitel 5 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
Kapitel 6 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
Kapitel 7 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
Kapitel 8 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
Kapitel 9 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
Kapitel 10 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
"Patatokukashi"](https://nlp100.github.io/ja/ch01.html#01-%E3%83%91%E3%82%BF%E3%83%88%E3%82%AF Das Problem von% E3% 82% AB% E3% 82% B7% E3% 83% BC% E3% 83% BC) ist wie folgt.
1 der Zeichenkette "Patatokukashii",3,5,Nehmen Sie das 7. Zeichen heraus und erhalten Sie die verkettete Zeichenfolge.
Wenn Sie die Frage lesen, lautet die Antwort "Pattocar", da es sich um das 1,3,5,7-te Zeichen von "Patatokukasi" handelt. Alle folgenden Antworten geben "Patrol Car" zurück, wenn der letzte Ausdruck ausgewertet wird.
Es gibt eine Methode, um es gehorsam am Ende der Zeichenfolge hinzuzufügen.
enumerate (s)
ist ein Iterator zum Scannen von (0, s [0]), ..., (n-1, s [n-1])
mit n = len (s)
Kehrt zurück.
#einfach
s = "Patatoku Kashii"
result = ""
for n,c in enumerate(s):
if n%2==0:
result += c
result #=> 'Pat Auto'
Sie können auch mit "map" oder "filter" schreiben, die vom Funktionstyp abgeleitet sind. Sie können die Vorteile in diesem Beispiel nicht wirklich spüren ...
#Funktionell
s = "Patatoku Kashii"
"".join(
map(
lambda x:x[1],
filter(
lambda x:x[0]%2==0,
enumerate(s)
)
)
) #=> 'Pat Auto'
Ist es etwas besser, die im Lambda-Ausdruck definierte Funktion zu benennen?
#Funktionell
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)
)
)
) #=> 'Pat Auto'
Es fühlt sich übertrieben an, wenn Sie ihm zu viel Namen geben.
#Funktionell
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)
)
)
) #=> 'Pat Auto'
Ich hoffe, dass eine solche Funktion vorbereitet ist. Die Funktionsdefinition durch den Lambda-Ausdruck entspricht der normalen Funktionsdefinition unten.
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
Es kann besser sein, es leise in eine Variable zu setzen.
Da filter
und map
einen Iterator (Generator) zurückgeben, wird die Liste nicht jedes Mal generiert, wenn Sie sie in eine Variable einfügen.
Ich habe nicht das Gefühl, dass der Rückruf wie JavaScript auf der Rückseite sein sollte.
#Funktionell
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) #=> 'Pat Auto'
Es ist einfacher, in die Einschlussnotation zu schreiben, ohne sich an "map" und "filter" zu halten. Das Schreiben von "[x für x in l]" ist eine Listeneinschlussnotation, und das Schreiben von "(x für x in l)" ist eine Generatoreinschlussnotation. "f ((x für x in l))" kann mit "f (x für x in l)" und einer Klammer weniger geschrieben werden. Das gleichzeitige Zuweisen von Werten zu mehreren Variablen ist einfacher zu verstehen, als sie mit "x" zu empfangen und mit "x [0]" oder "x [1]" abzurufen.
#Einschlussnotation
s = "Patatoku Kashii"
"".join(c for n,c in enumerate(s) if n%2==0) #=> 'Pat Auto'
Pythonic
Python-ähnlich zu sein heißt ** Pythonic **, aber ist dieser Code der pythonischste?
Die Methode für den Zugriff auf eine Liste oder Zeichenfolge mit s [start: end: step]
wird als Slicing bezeichnet.
Wenn Sie "2" für "Schritt" angeben, wird dieser um eins übersprungen.
# Pythonic
s = "Patatoku Kashii"
s[::2] #=> 'Pat Auto'
Sie können auch Ihren eigenen Index vorbereiten und drehen, ohne "Aufzählung" zu verwenden.
#Dreh dich selbst um
s = "Patatoku Kashii"
result = ""
n = 0
for c in s:
if n%2==0:
result += c
n += 1
result #=> 'Pat Auto'
Lösen Sie 100 Sprachverarbeitungsklopfen 2020 (01. Umgekehrte Reihenfolge der Zeichenketten) Sie können es der Liste hinzufügen und später kombinieren. Ich kann es schaffen
#einfach
s = "Patatoku Kashii"
l = []
for n, c in enumerate(s):
if n%2==0:
l.append(c)
"".join(l) #=> 'Pat Auto'
Sie fragen sich vielleicht, was besser ist: "Zeichenfolgen kombinieren" oder "Zur Liste hinzufügen". Wenn Sie eine Liste allgemeiner Objekte anstelle von Zeichen bearbeiten, werden Sie diese unweigerlich zur Liste hinzufügen. Wenn das Ziel jedoch darin besteht, eine Zeichenfolge wie diese zu generieren, spielt es keine Rolle, welche. Wenn es größer und langsamer wird, hören Sie auf und denken Sie darüber nach.
#einfach
s = "Patatoku Kashii"
result = ""
for n,c in enumerate(s):
if n%2==0:
result += c
result #=> 'Pat Auto'
#einfach
s = "Patatoku Kashii"
l = []
for n, c in enumerate(s):
if n%2==0:
l.append(c)
"".join(l) #=> 'Pat Auto'
Recommended Posts