C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
hightemp.txt est un fichier qui stocke l'enregistrement de la température la plus élevée au Japon dans le format délimité par des tabulations de «préfecture», «point», «℃» et «jour». Créez un programme qui effectue le traitement suivant et exécutez hightemp.txt en tant que fichier d'entrée. De plus, exécutez le même processus avec une commande UNIX et vérifiez le résultat de l'exécution du programme.
Trouvez la fréquence d'apparition de la première colonne de chaque ligne et affichez-les par ordre décroissant. Utilisez les commandes cut, uniq et sort pour confirmation.
main.py
# coding: utf-8
from itertools import groupby
fname = 'hightemp.txt'
#Lire le nom de la préfecture
lines = open(fname).readlines()
kens = [line.split('\t')[0] for line in lines]
#Agrégé par préfecture(Préfectures,Fréquence d'apparition)liste
kens.sort() #goupby est censé être trié
result = [(ken, len(list(group))) for ken, group in groupby(kens)]
#Trier par fréquence d'occurrence
result.sort(key=lambda ken: ken[1], reverse=True)
#Sortie de résultat
for ken in result:
print('{ken}({count})'.format(ken=ken[0], count=ken[1]))
Terminal
Saitama(3)
Préfecture de Yamagata(3)
Préfecture de Yamanashi(3)
Préfecture de Gunma(3)
Préfecture de Chiba(2)
Préfecture de Gifu(2)
Préfecture d'Aichi(2)
Préfecture de Shizuoka(2)
Préfecture de Wakayama(1)
Préfecture d'Osaka(1)
Préfecture d'Ehime(1)
Préfecture de Kochi(1)
test.sh
#!/bin/sh
#Trier par la première colonne, supprimer les doublons, sortir avec le nombre d'observations, trier le résultat
cut --fields=1 hightemp.txt | sort | uniq --count | sort --reverse
Terminal
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/19$ ./test.sh
3 Préfecture de Yamanashi
3 Préfecture de Yamagata
3 Préfecture de Saitama
3 Préfecture de Gunma
2 Chiba
2 Préfecture de Shizuoka
2 Préfecture de Gifu
2 Préfecture d'Aichi
1 Préfecture de Wakayama
1 Préfecture d'Osaka
1 Préfecture de Kochi
1 Préfecture d'Ehime
Comme dans la question précédente, l'ordre des lieux avec la même fréquence d'apparition changera, donc je n'ai pas fait de mon mieux pour faire correspondre le format et diff
, et vérifié visuellement.
Cette fois, j'ai essayé d'utiliser la notation d'inclusion pour la première fois. La partie qui crée la liste est en quelque sorte devenue lisible et inscriptible.
La partie à agréger par préfecture est [itertools.groupby ()] J'ai utilisé (http://docs.python.jp/3/library/itertools.html#itertools.groupby). Il est important de noter qu'il est nécessaire de trier à l'avance, comme pour UNIX ʻuniq` utilisé pour la confirmation.
En fait, au début, j'ai mal compris le sens du problème
Trouvez la fréquence d'occurrence de la chaîne de caractères dans la première colonne de chaque ligne et affichez [chaque ligne] côte à côte dans l'ordre décroissant.
Je croyais que c'était. Comme c'est un gros problème, je posterai également le code et le résultat.
main2.py
# coding: utf-8
from itertools import groupby
fname = 'hightemp.txt'
def get_ken(target):
'''Découpez la partie préfecture des données pour une ligne
argument:
target --Une ligne de données
Valeur de retour:
Chaîne de caractères préfectorale
'''
return target.split('\t')[0]
#Lis
lines = open(fname).readlines()
#Agrégé par préfecture
lines.sort(key=get_ken) #goupby est censé être trié
groups = groupby(lines, key=get_ken)
#Résultats agrégés(Préfectures,Fréquence d'apparition,Liste des lignes applicables)Convertir en une liste de
result = []
for ken, group in groups:
lines = list(group)
result.append((ken, len(lines), lines))
#Trier par fréquence d'occurrence
result.sort(key=lambda group: group[1], reverse=True)
#Affichage des résultats
for group in result:
for line in group[2]:
print(line, end='')
get_ken ()
est une fonction qui récupère la préfecture dans la première colonne, et comme elle est utilisée à deux endroits, sort ()
et groupby ()
, c'est une fonction au lieu d'une expression lambda.
Terminal
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Koshiya, Préfecture de Saitama.4 2007-08-16
39 Hatoyama, Préfecture de Saitama.9 1997-07-05
Yamagata 40 Yamagata.8 1933-07-25
40 Sakata, Préfecture de Yamagata.1 1978-08-03
39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03
Préfecture de Yamanashi Kofu 40.7 2013-08-10
40 Katsunuma, préfecture de Yamanashi.5 2013-08-10
Otsuki, Yamanashi 39.9 1990-07-19
Préfecture de Gunma Tatebayashi 40.3 2007-08-16
Préfecture de Gunma Kamisatomi 40.3 1998-07-04
Préfecture de Gunma Maebashi 40 2001-07-24
Préfecture de Chiba Ushihisa 40.2 2004-07-20
39 Shigehara, Chiba.9 2013-08-11
40 Tajimi, Préfecture de Gifu.9 2007-08-16
Mino 40, préfecture de Gifu 2007-08-16
Ainishi 40, Préfecture d'Aichi.3 1994-08-05
Préfecture d'Aichi Nagoya 39.9 1942-08-02
Préfecture de Shizuoka Tenryu 40.6 1994-08-04
Préfecture de Shizuoka Sakuma 40.2 2001-07-24
Préfecture de Wakayama Katsuragi 40.6 1994-08-08
Toyonaka 39, Osaka.9 1994-08-08
40 Uwajima, Préfecture d'Ehime.2 1927-07-22
Préfecture de Kochi Egawasaki 41 2013-08-12
C'est tout pour le 20e coup. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.
Recommended Posts