Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
hightemp.txt ist eine Datei, in der die Aufzeichnung der höchsten Temperatur in Japan im tabulatorgetrennten Format "Präfektur", "Punkt", "℃" und "Tag" gespeichert wird. Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt, und führen Sie hightemp.txt als Eingabedatei aus. Führen Sie außerdem denselben Prozess mit einem UNIX-Befehl aus und überprüfen Sie das Ausführungsergebnis des Programms.
Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und zeigen Sie sie in absteigender Reihenfolge an. Verwenden Sie zur Bestätigung die Befehle cut, uniq und sort.
main.py
# coding: utf-8
from itertools import groupby
fname = 'hightemp.txt'
#Den Namen der Präfektur lesen
lines = open(fname).readlines()
kens = [line.split('\t')[0] for line in lines]
#Aggregiert nach Präfektur(Präfekturen,Häufigkeit des Auftretens)Aufführen
kens.sort() #goupby soll sortiert werden
result = [(ken, len(list(group))) for ken, group in groupby(kens)]
#Nach Häufigkeit des Auftretens sortieren
result.sort(key=lambda ken: ken[1], reverse=True)
#Ergebnisausgabe
for ken in result:
print('{ken}({count})'.format(ken=ken[0], count=ken[1]))
Terminal
Saitama(3)
Präfektur Yamagata(3)
Präfektur Yamanashi(3)
Präfektur Gunma(3)
Präfektur Chiba(2)
Präfektur Gifu(2)
Präfektur Aichi(2)
Präfektur Shizuoka(2)
Präfektur Wakayama(1)
Präfektur Osaka(1)
Präfektur Ehime(1)
Präfektur Kochi(1)
test.sh
#!/bin/sh
#Nach der ersten Spalte sortieren, Duplikate entfernen, mit der Anzahl der Fälle ausgeben, das Ergebnis sortieren
cut --fields=1 hightemp.txt | sort | uniq --count | sort --reverse
Terminal
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/19$ ./test.sh
3 Präfektur Yamanashi
3 Präfektur Yamagata
3 Präfektur Saitama
3 Präfektur Gunma
2 Chiba
2 Präfektur Shizuoka
2 Präfektur Gifu
2 Präfektur Aichi
1 Präfektur Wakayama
1 Präfektur Osaka
1 Präfektur Kochi
1 Präfektur Ehime
Wie in der vorherigen Frage ändert sich die Reihenfolge der Orte mit der gleichen Häufigkeit des Auftretens. Daher habe ich nicht mein Bestes getan, um das Format und "diff" abzugleichen, und sie visuell überprüft.
Diesmal habe ich zum ersten Mal versucht, die Einschlussnotation zu verwenden. Der Teil, der die Liste erstellt, ist irgendwie lesbar und beschreibbar geworden.
Der Teil, der von der Präfektur aggregiert werden soll, ist [itertools.groupby ()] Ich habe (http://docs.python.jp/3/library/itertools.html#itertools.groupby) verwendet. Wie bei dem zur Bestätigung verwendeten UNIX-Uniq ist es wichtig zu beachten, dass es im Voraus sortiert werden muss.
Eigentlich habe ich zuerst die Bedeutung des Problems falsch verstanden
Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und zeigen Sie [jede Zeile] nebeneinander in absteigender Reihenfolge an.
Ich dachte es wäre. Da es eine große Sache ist, werde ich auch den Code und das Ergebnis veröffentlichen.
main2.py
# coding: utf-8
from itertools import groupby
fname = 'hightemp.txt'
def get_ken(target):
'''Schneiden Sie den Präfekturteil für eine Zeile aus den Daten aus
Streit:
target --Eine Datenzeile
Rückgabewert:
Präfekturale Zeichenkette
'''
return target.split('\t')[0]
#Lesen
lines = open(fname).readlines()
#Aggregiert nach Präfektur
lines.sort(key=get_ken) #goupby soll sortiert werden
groups = groupby(lines, key=get_ken)
#Aggregierte Ergebnisse(Präfekturen,Häufigkeit des Auftretens,Liste der zutreffenden Zeilen)In eine Liste von konvertieren
result = []
for ken, group in groups:
lines = list(group)
result.append((ken, len(lines), lines))
#Nach Häufigkeit des Auftretens sortieren
result.sort(key=lambda group: group[1], reverse=True)
#Ergebnisanzeige
for group in result:
for line in group[2]:
print(line, end='')
get_ken () ist eine Funktion, die die Präfektur in der ersten Spalte abruft. Da sie an zwei Stellen verwendet wird, sort () und groupby (), ist sie eine Funktion anstelle eines Lambda-Ausdrucks.
Terminal
40 Kumagai, Präfektur Saitama.9 2007-08-16
40 Koshiya, Präfektur Saitama.4 2007-08-16
39 Hatoyama, Präfektur Saitama.9 1997-07-05
Yamagata 40 Yamagata.8 1933-07-25
40 Sakata, Präfektur Yamagata.1 1978-08-03
39 Tsuruoka, Präfektur Yamagata.9 1978-08-03
Präfektur Yamanashi Kofu 40.7 2013-08-10
40 Katsunuma, Präfektur Yamanashi.5 2013-08-10
Otsuki, Yamanashi 39.9 1990-07-19
Präfektur Gunma Tatebayashi 40.3 2007-08-16
Präfektur Gunma Kamisatomi 40.3 1998-07-04
Präfektur Gunma Maebashi 40 2001-07-24
Präfektur Chiba Ushihisa 40.2 2004-07-20
39 Shigehara, Chiba.9 2013-08-11
40 Tajimi, Präfektur Gifu.9 2007-08-16
Mino 40, Präfektur Gifu 2007-08-16
Ainishi 40, Präfektur Aichi.3 1994-08-05
Präfektur Aichi Nagoya 39.9 1942-08-02
Präfektur Shizuoka Tenryu 40.6 1994-08-04
Präfektur Shizuoka Sakuma 40.2 2001-07-24
Präfektur Wakayama Katsuragi 40.6 1994-08-08
Toyonaka 39, Osaka.9 1994-08-08
40 Uwajima, Präfektur Ehime.2 1927-07-22
Präfektur Kochi Egawasaki 41 2013-08-12
Das ist alles für den 20. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.
Recommended Posts