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.
Disposez chaque ligne dans l'ordre inverse des nombres de la troisième colonne (Remarque: réorganisez le contenu de chaque ligne sans les changer). Utilisez la commande sort pour confirmation (ce problème ne doit pas nécessairement correspondre au résultat de l'exécution de la commande).
main.py
# coding: utf-8
fname = 'hightemp.txt'
lines = open(fname).readlines()
lines.sort(key=lambda line: float(line.split('\t')[2]), reverse=True)
for line in lines:
print(line, end='')
Terminal
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Tajimi, Préfecture de Gifu.9 2007-08-16
Yamagata 40 Yamagata.8 1933-07-25
Préfecture de Yamanashi Kofu 40.7 2013-08-10
Préfecture de Wakayama Katsuragi 40.6 1994-08-08
Préfecture de Shizuoka Tenryu 40.6 1994-08-04
40 Katsunuma, préfecture de Yamanashi.5 2013-08-10
40 Koshiya, Préfecture de Saitama.4 2007-08-16
Préfecture de Gunma Tatebayashi 40.3 2007-08-16
Préfecture de Gunma Kamisatomi 40.3 1998-07-04
Ainishi 40, Préfecture d'Aichi.3 1994-08-05
Préfecture de Chiba Ushihisa 40.2 2004-07-20
Préfecture de Shizuoka Sakuma 40.2 2001-07-24
40 Uwajima, Préfecture d'Ehime.2 1927-07-22
40 Sakata, Préfecture de Yamagata.1 1978-08-03
Mino 40, préfecture de Gifu 2007-08-16
Préfecture de Gunma Maebashi 40 2001-07-24
39 Shigehara, Chiba.9 2013-08-11
39 Hatoyama, Préfecture de Saitama.9 1997-07-05
Toyonaka 39, Osaka.9 1994-08-08
Otsuki, Yamanashi 39.9 1990-07-19
39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03
Préfecture d'Aichi Nagoya 39.9 1942-08-02
test.sh
#!/bin/sh
#Trier dans l'ordre inverse avec la troisième colonne sous forme de nombre
sort hightemp.txt --key=3,3 --numeric-sort --reverse > result_test.txt
#Exécuter avec le programme Python
python main.py > result.txt
#Vérifiez le résultat
diff --report-identical-files result.txt result_test.txt
Terminal
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/18$ ./test.sh
10d9
<Préfecture de Gunma Tatebayashi 40.3 2007-08-16
11a11
>Préfecture de Gunma Tatebayashi 40.3 2007-08-16
17d16
<Mino 40, préfecture de Gifu 2007-08-16
19,20c18
<39 Shigehara, Chiba.9 2013-08-11
<39 Hatoyama, Préfecture de Saitama.9 1997-07-05
---
>Mino 40, préfecture de Gifu 2007-08-16
21a20
>39 Shigehara, Chiba.9 2013-08-11
23a23
>39 Hatoyama, Préfecture de Saitama.9 1997-07-05
La différence a été détectée par diff
, mais comme la température dans la troisième colonne a la même valeur, il ne peut pas être aidé qu'il y ait une différence dans cette partie.
Cette fois, j'ai essayé d'utiliser la formule lambda pour la première fois. C'est la partie de lambda line: float (line.split ('\ t') [2])
. Pour la chaîne de caractères donnée line
, elle est utilisée à la place de la fonction qui renvoie la troisième colonne divisée par \ t
comme float
. Cependant, c'est un peu déroutant. Comme pour la notation d'inclusion, je pense que vous êtes habitué à ce domaine.
À propos, dans l'explication des Petites fonctions et expressions lambda dans le document Python, l'auteur Il a dit qu'il aimait le style sans lambda.
Au moment du tri, il faut faire attention au type des données cibles.
Dans les données cibles cette fois, si vous oubliez de convertir en float
avec l'expression lambda ou si vous oubliez d'ajouter --numeric-sort
avec la commande UNIX sort
, le résultat correct sera obtenu, mais si la température est de 5 degrés Si les lieux sont mélangés, il arrivera au sommet même si la température est la plus basse.
C'est tout pour le 19e coup. Si vous avez des erreurs, j'apprécierais que vous les signaliez.
Recommended Posts