作者: 機械伯爵
日時: 2002/5/5(14:25)
 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行
で展開することが可能になります。

 しかも、非常にすっきりしていて直感的なので、コードも読みやすくなります。

   機械伯爵