Perlに負けるな、ということで、ソート機能つき
最終版をアップします。
※こーいうのを意地という・・・
※参考までに言うと、私は普通はawkからsortに渡すのが
普通です。
--^
# index2c.py
# ソート機能追加
# 初心者ブース対応、詳細説明入り
# 初心者でないと、かなりくどい・・・
import sys,string
# 外部モジュールをインポート
# sysは引数リスト(sys.argv)を導入するために、
# stringは連結関数joinを導入するために行っています。
file = open(sys.argv[1],"r")
# 引数で与えられたファイル名のファイルを
#「読み出し」モードでオープン。
# "r"はread「読み出し」
# "w"はwright「書き込み、更新」
# "a"はadd「追加」
f_list = file.readlines()
# readlinesメソッドは、テキストファイルの1行を1項目
# としてリストを作成。
tbl = {}
# 辞書(連想配列)として追加できるように、空の辞書を作って
# おく。
for i in f_list: # リストの全てのメンバーについて行う
i = i.split() # 空白文字を区切りとしてリストを作成
if i.__len__() > 2: # 索引の名前に空白文字があった場合
i[1]=string.join(i[1:]) # 2項以降を2項につなげて放り込み、
i=i[:2] # いらん部分をちょん切る
page , name = i # タプル展開。Pythonの必殺技の一つ。
if tbl.has_key(name): # すでに索引名が存在する場合は、
tbl[name] = tbl[name] + "," + page # ページを追加
else : # 今まで無かった場合は・・・
tbl[name] = page # ページと項目を追加
tbl_list = tbl.keys()
# 連想配列はアクセスの関係上順不同ハッシュテーブルなので、
# インデックスキーを一旦リストに取り出して・・・
tbl_list.sort()
# ソートメソッドで並べ替え
for name in tbl_list:
print "%-20s" % name , " ... " , tbl[name]
# %演算子を文字列に使用すると、C言語のprintfのような出力フォーマット
# が指定できる。
--$
というわけで、コメントを全て読まれた方、おつかれさま(笑)
Pythonを知らない人について、タプル展開については、ちょっと補足。
※PerlやRubyあたりにはありそうな機能だけど、他の言語では多分無いと
思われるので・・・
タプル展開は、=代入子の左辺と右辺のシーケンス(タプル、リスト、文字列
など)の項目数が等しい場合、展開して順番に代入していくことが出来ます。
例)a,b,c=1,2,3
ちなみにコンマで区切ったオブジェクトは、Pythonではタプルとみなされます。
これを利用すると、ループを使用しないと展開できなかったシーケンスを1行
で展開することが可能になります。
しかも、非常にすっきりしていて直感的なので、コードも読みやすくなります。
機械伯爵