"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

言語処理100本ノック 2015をやってみた(第2章)



スポンサーリンク

やばいおもろすぎる。第2章やってみた。www.cl.ecei.tohoku.ac.jp

10. 行数のカウント

【プログラム】

#!/usr/bin/env python
# coding:utf-8

i=0
for line in open('hightemp.txt', 'r'):
        i+=1
print i

【実行&結果】

$ sudo python 10.py
24

【確認】

$ wc -l hightemp.txt
24 hightemp.txt


11. タブをスペースに置換

【プログラム】

#!/usr/bin/env python
# coding:utf-8

for line in open('hightemp.txt', 'r'):
    print line[:-1].replace('\t', '  ')

【実行&結果】

$ sudo python 11.py
高知県  江川崎  41  2013-08-12
埼玉県  熊谷  40.9  2007-08-16
岐阜県  多治見  40.9  2007-08-16
・
・
・
<省略>

【確認】

$ expand -t 2 hightemp.txt
高知県 江川崎 41  2013-08-12
埼玉県 熊谷  40.9  2007-08-16
岐阜県 多治見 40.9  2007-08-16
・
・
・
<省略>


12. 1列目をcol1.txtに,2列目をcol2.txtに保存

【プログラム】

#!/usr/bin/env python
# coding:utf-8

str1=""
str2=""

for line in open('hightemp.txt', 'r'):
        itemList = line[:-1].split('\t')
        str1 += itemList[0] + "\n"
        str2 += itemList[1] + "\n"

f = open('col1.txt', 'w')
f.write(str1)
f.close()

f = open('col2.txt', 'w')
f.write(str2)
f.close()

【実行&結果】

$ sudo python 12.py
$ cat col1.txt
高知県
埼玉県
岐阜県
・
・
・
<省略>

$ cat col2.txt
江川崎
熊谷
多治見
・
・
・
<省略>

【確認】

$ cut -f 1 hightemp.txt
高知県
埼玉県
岐阜県
・
・
・
<省略>

$ cut -f 2 hightemp.txt
江川崎
熊谷
多治見
・
・
・
<省略>


13. col1.txtとcol2.txtをマージ

【プログラム】

#!/usr/bin/env python
# coding:utf-8

temp_arr=[]
temp_str=""

for (a,b) in zip(open('col1.txt', 'r'),open('col2.txt', 'r')):
        temp_arr.append([a[:-1],b[:-1]])

for i in temp_arr:
        temp_str += i[0] + "\t" + i[1] + "\n"

f = open('col1-2.txt', 'w')
f.write(temp_str)
f.close()

【実行&結果】

$ sudo python 13.py
$ cat col1-2.txt
高知県  江川崎
埼玉県  熊谷
岐阜県  多治見
・
・
・
<省略>

【確認】

0$ paste col1.txt col2.txt
高知県  江川崎
埼玉県  熊谷
岐阜県  多治見
・
・
・
<省略>


14. 先頭からN行を出力

【プログラム】

#!/usr/bin/env python
# coding:utf-8

import sys
import random

argvs = sys.argv
num   = int(argvs[1])
i = 0

for a in open('hightemp.txt', 'r'):
        if num > i:
                print a[:-1]
        else:
                break
        i+=1

【実行&結果】

$ sudo python 14.py 3
高知県  江川崎  41      2013-08-12
埼玉県  熊谷    40.9    2007-08-16
岐阜県  多治見  40.9    2007-08-16


15. 末尾のN行を出力

【プログラム】

#!/usr/bin/env python
# coding:utf-8

import sys
import random

argvs = sys.argv
num   = int(argvs[1])

i=0
for line in open('hightemp.txt', 'r'):
        i+=1

j = 0
for a in open('hightemp.txt', 'r'):
        #print str(i) + " " + str(num) + " " + str(j)
        if (i - num) <= j:
                print a[:-1]
        j+=1

【実行&結果】

$ sudo python 15.py 4
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02

【確認】

$ tail -n 4 hightemp.txt
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02

16. ファイルをN分割する

【プログラム】

#!/usr/bin/env python
# coding:utf-8

import sys
import random

argvs = sys.argv
num   = int(argvs[1])
temp_arr1 = []
temp_arr2 = []

for line in open('hightemp.txt', 'r'):
        temp_arr1.append(line[:-1])

if len(temp_arr1)%num > 0:
        split_num = len(temp_arr1)/num + 1
else:
        split_num = len(temp_arr1)/num

temp_arr2 = [temp_arr1[i:i+split_num] for i in range(0,(len(temp_arr1)-1),split_num)]

i=0
for a in temp_arr2:
        f = open('16-' + str(i) + '.txt', 'w')
        temp = ""
        for b in a:
                temp += b + "\n"
        f.write(temp)
        i+=1
        f.close()

【実行&結果】

$ sudo python 16.py 5
$

$ ls | grep 16-
16-0.txt
16-1.txt
16-2.txt
16-3.txt
16-4.txt

$ cat -n 16-0.txt
     1  高知県  江川崎  41      2013-08-12
     2  埼玉県  熊谷    40.9    2007-08-16
     3  岐阜県  多治見  40.9    2007-08-16
     4  山形県  山形    40.8    1933-07-25
     5  山梨県  甲府    40.7    2013-08-10

・
・
<省略>
・
・
$ cat -n 16-4.txt
     1  大阪府  豊中    39.9    1994-08-08
     2  山梨県  大月    39.9    1990-07-19
     3  山形県  鶴岡    39.9    1978-08-03
     4  愛知県  名古屋  39.9    1942-08-0
$ split -n 5 hightemp.txt

$ ls | grep xa
xaa
xab
xac
xad
xae

$ cat -n xaa
     1  高知県  江川崎  41      2013-08-12
     2  埼玉県  熊谷    40.9    2007-08-16
     3  岐阜県  多治見  40.9    2007-08-16
     4  山形県  山形    40.8    1933-07-25
     5  山梨県  甲府    40.7    2013

$ cat -n xae
     1  玉県    鳩山    39.9    1997-07-05
     2  大阪府  豊中    39.9    1994-08-08
     3  山梨県  大月    39.9    1990-07-19
     4  山形県  鶴岡    39.9    1978-08-03
     5  愛知県  名古屋  39.9    1942-08-02

#なんかsplitしたcatの方が変なデータになっている?


17. 1列目の文字列の異なり

【プログラム】

#!/usr/bin/env python
# coding:utf-8

temp_arr=[]

for line in open('hightemp.txt', 'r'):
        itemList = line[:-1].split('\t')
        temp_arr.append(itemList[0])

li_uniq = list(set(temp_arr))

for a in li_uniq:
        print a

【実行&結果】

$ sudo python 17.py
愛知県
山形県
岐阜県
千葉県
埼玉県
高知県
群馬県
山梨県
和歌山県
愛媛県
大阪府
静岡県

【確認】

$ cut -f1 hightemp.txt | sort | uniq
埼玉県
岐阜県
山形県
和歌山県
山梨県
愛媛県
大阪府
千葉県
愛知県
群馬県
静岡県
高知県


18. 各行を3コラム目の数値の降順にソート

【プログラム】

#!/usr/bin/env python
# coding:utf-8

temp_arr=[]

for line in open('hightemp.txt', 'r'):
        itemList = line[:-1].split('\t')
        temp_arr.append(itemList)

temp_arr.sort(key=lambda x:x[2])

for a in temp_arr:
        temp = ""
        for b in a:
                temp+=b + "\t"
        print temp

【実行&結果】

$ sudo python 18.py
千葉県  茂原    39.9    2013-08-11
埼玉県  鳩山    39.9    1997-07-05
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
・
・
・
<省略>

【確認】

$ sort -k 3 hightemp.txt
愛知県  名古屋  39.9    1942-08-02
山形県  鶴岡    39.9    1978-08-03
山梨県  大月    39.9    1990-07-19
大阪府  豊中    39.9    1994-08-08
・
・
・
<省略>

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

【プログラム】

#!/usr/bin/env python
# coding:utf-8

temp_arr=[]

for line in open('hightemp.txt', 'r'):
        itemList = line[:-1].split('\t')
        temp_arr.append(itemList[0])

temp_arr.sort()
pre_str = ""
temp=[]

for a in temp_arr:
        if pre_str == a:
                temp[len(temp)-1] = [a,temp[len(temp)-1][1]+1]
        else:
                pre_str = a
                temp.append([a,1])

temp.sort(reverse=True,key=lambda x:x[1])
temp_str=""
for a in temp:
        temp_str+= a[0] + " " + str(a[1]) + "\n"

print temp_str

【実行&結果】

$ sudo python 19.py
埼玉県 3
山形県 3
山梨県 3
群馬県 3
千葉県 2
岐阜県 2
愛知県 2
静岡県 2
和歌山県 1
大阪府 1
愛媛県 1
高知県 1

【確認】

$ cut -f 1 hightemp.txt | sort | uniq -c | sort -k 1 -r
      3 群馬県
      3 山梨県
      3 山形県
      3 埼玉県
      2 静岡県
      2 愛知県
      2 千葉県
      2 岐阜県
      1 高知県
      1 大阪府
      1 愛媛県
      1 和歌山県


azwoo.hatenablog.com