[PYTHON] 100 coups de traitement du langage amateur: 19

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

Chapitre 2: Principes de base des commandes UNIX

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.

19. Trouvez la fréquence d'apparition de la première colonne de chaque ligne et classez-les par ordre décroissant de fréquence d'apparition.

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.

Le code fini:

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]))

Résultat de l'exécution:

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)

Script shell pour vérifier les commandes UNIX:

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

Confirmation des résultats:

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.

Notation d'inclusion

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.

Traitement d'agrégation

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.

Mauvaise interprétation du problème

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.

Code terminé (version malentendue):

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.

Résultat de l'exécution (version malentendue):

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

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 81
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de traitement du langage amateur: 12
100 coups de traitement du langage amateur: 14
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 19
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 98
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 32
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 87
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de traitement du langage amateur: 23
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 68
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 74
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 64
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 36
100 coups de traitement du langage amateur: 77
100 coups de langue amateur: 01
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03
100 coups de traitement du langage amateur: 82
100 coups de traitement du langage amateur: 69
100 coups de traitement du langage amateur: 53
100 coups de traitement du langage amateur: 18
100 coups de traitement du langage amateur: 35
100 coups de traitement du langage amateur: 91