研究室‎ > ‎卒業生のみなさまへ‎ > ‎松本 宏‎ > ‎python‎ > ‎100本ノック‎ > ‎

第1セット

データ:提供されてはいないが、生成方法などの記述があったが、うまく生成できなかったので郵便局のHPより生データを利用。
(1)
#! /usr/bin/en python
# -*- coding: utf-8 -*-
#(1) 行数をカウントしたもの.確認にはwcコマンドを用いよ
#アプローチ:F.readlines()で行ごとに読み込みリスト化、
#そのリストの要素数カウントをlen()関数で行う。

f = open("../43KUMAMO.CSV", "r")
Content = f.readlines()
print len(Content)
f.close()

(2) タブ1文字につきスペース1文字に置換したもの.とあるが生データはCSV(コンマで区切られたデータとなっていたのでコンマをスペースに置き換える設問にした。)
#! /usr/bin/en python
# -*- coding: utf-8 -*-
#(2) タブ1文字につきスペース1文字に置換したもの.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
#アプローチ:F.split(), F.join関数の利用
#設定変更:タブ1文字につき→コンマ1文字につき
f = open("../43KUMAMO.CSV", "r")
for line in f.readlines():
    print " ".join(line.split(","))
f.close()

(3)
#! /usr/bin/en python
# -*- coding: utf-8 -*-
#(3) 各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ
#アプローチ:for文とsplit関数の利用、書き出しにwrite関数
f = open("../43KUMAMO.CSV", "r")
wfF = open("col1.txt","w");
wfS = open("col2.txt","w");
for line in f.readlines():
    line = line.split(",")
    FirCol = line[0]
    SecCol = line[1]
    print u"1列目: %s" % FirCol,
    print u"2列目: %s" % SecCol
    wfF.write(FirCol+"\n")
    wfS.write(SecCol+"\n")
f.close()
wfF.close()
wfS.close()


(4)
#! /usr/bin/en python
# -*- coding: utf-8 -*-
#(4) (3)で作ったcol1.txtとcol2.txtを結合し,元のタブ区切りテキストを復元したもの.確認にはpasteコマンドを用いよ.
#アプローチ:for文とsplit関数の利用、書き出しにwrite関数
f = open("../43KUMAMO.CSV", "r")
wfF = open("first_col.col","w");
wfS = open("second_col.col","w");
wfR = open("復元.txt","w");
for line in f.readlines():
    line = line.split(",")
    FirCol = line[0]
    SecCol = line[1]
    wfR.write(FirCol+"\t"+SecCol+"\n")
f.close()
wfF.close()
wfS.close()
wfR.close()

(5), (6)

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

# (6) 自然数Nをコマンドライン引数にとり,入力のうち末尾のN行だけ.確認にはtailコマンドを用いよ

# アプローチ:

import sys 

N = int(sys.argv[1]) # $python 006.py 1 のようにファイル名の次に数値が来ると仮定
#if(isinstance(N, int)):#http://www.gossamer-threads.com/lists/python/python/97153
#    print "it is an int"
#    print N
#else:
#    print "it is not an int"
#    print N


f = open("43KUMAMO.CSV","r")
lines = f.readlines()
for num in range(0, N): #(5)
#for num in range(N, len(lines)):#(6)
    print lines[num]
f.close()

(7)

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

#(7) 1コラム目の文字列の異なり数(種類数).確認にはcut, sort, uniq, wcコマンドを用いよ.
#line[a,b,c,d,e,f]とあったらaがline[0], line[1], line[2],・・・で異なるline要素が何個あるかってこと?

#アプローチ:aの内容をリスト

file = open("43KUMAMO.CSV", "r")
NewList = set()
for line in file.readlines():
    item = line.split(",")
    NewList.add(item[0])

print len(NewList)

file.close()


(9)
#! /usr/bin/env python
# -*- encoding: utf-8 -*-
#(9) 各行を2コラム目,1コラム目の優先順位で辞書の逆順ソートしたもの(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題は結果が合わなくてもよい).
#アプローチ:sorted関数の利用(key値の使用)
#参考:
#みんなのPython 柴田淳
#http://docs.python.jp/2/howto/sorting.html

import csv
file = open("43KUMAMO.CSV","r")
contents = csv.reader(file)
NewList = []
for line in contents:
    #print line[3],
    #print line[4], 
    #print line[5], 
    #print line[6], 
    #print line[7], 
    #print line[8]
    NewList.insert(len(NewList), [line[4], line[5], line[7], line[8]])

NewList.sort(key=lambda x:(x[1],x[0]), reverse=True)

for line in NewList:
    print line[0],
    print line[1],
    print line[2],
    print line[3]

file.close()


(10)
#! /usr/bin/env python
#-*- encoding: utf-8 -*-
#(10) 各行の2コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べよ.ただし,(3)で作成したプログラムの出力(col2.txt)を読み込むプログラムとして実装せよ.確認にはcut, uniq, sortコマンドを用い

#はしょり:(3)で作成したプログラムの出力(col2.txt)を読み込むプログラムとして実装せよ
#アプローチ: 読み込みファイルより[文字列, 頻度]のリストを作成

#List = [["abd","asbd"],["wbd","zzdbd","wbd"],["abd","asbd"]]
#List = [[1,2],[3,4,5],[1,2]]
#print List
#NewList = set(List)
#print NewList
#上を実行すると以下の結果となる
"""
[['abd', 'asbd'], ['wbd', 'zzdbd', 'wbd'], ['abd', 'asbd']]
Traceback (most recent call last):
  File "010.py", line 15, in <module>
    NewList = set(List)
TypeError: unhashable type: 'list'
"""
#多重リストにsetは適用不可?

import csv

file = open("43KUMAMO.CSV","r")
Contents = csv.reader(file)

FreqList = [] #[対象文字列(str)、頻度(int)]

for lineContents in Contents: #コンテンツのループ
    fInList = False #リスト用フラグ
    for itemFreqList in FreqList: #リストのループ
        if(lineContents[4]==itemFreqList[0]):#リストの中とのマッチング
            itemFreqList[1] += 1
            fInList = True #リストの中にあったらフラグを立てる
    if(fInList == False): #フラグがたってなかったら、
        #print lineContents[4]
        FreqList.insert(len(FreqList), [lineContents[4], 0])#リストに追加

FreqList.sort(key=lambda x:(x[1]), reverse=True)

for item in FreqList:
    print item[0],item[1]

file.close()

Comments