[PYTHON] Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")

Einführung

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.

Was ist 100 Sprachverarbeitung klopfen 2020?

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.

Link zum Qiita-Artikel

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

01. "Patatokukashi"

Problem

"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.

Antworten

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.

einfach

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'

Funktionell

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'

Einschlussnotation

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'

Andere Antwort

Nach Index drehen

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'

Zur Liste hinzufügen und später beitreten

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'

Zurückblicken

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

Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
Sprachverarbeitung 100 knock-86: Wortvektoranzeige
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-28: Entfernen des MediaWiki-Markups
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100-Sprachverarbeitung knock-24: Dateireferenz extrahieren
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
100 Sprachverarbeitungsklopfen (2020): 40