« お題5:行列の回転 | メイン | お題7:整数とビット列の相互変換 »

お題6:名簿の並び替え

下のようなローマ字表記された名簿データがあるとする。実際は3人ではなく1万人分あるとする。ミドルネームなどはなく、名字と名前の間は半角スペース1個で区切られている。


Nishio Hirokazu
Shibata Atsushi
Masuda Yasushi

  • 上のデータファイルからH. Nishioというイニシャル表記の名簿ファイルを作成せよ。
  • イニシャル表記で、名字でABC順にソートされた名簿ファイルを作れ。名字が同じ場合は名前のABC順になること。

トラックバック

このエントリーのトラックバックURL:
http://www.nishiohirokazu.org/mt/mt-tb.cgi/603

コメント (10)

磯野フネ:
f=open('edge6target.txt', 'w')
for x in file('edge6.txt'):
 i,j = x.split()
 f.write(i[0]+'. '+j+'\n')
f.close()


-----------------1


t=[]
for x in file('edge6.txt'):
 i,j = x.split()
 t.append(i[0]+'. '+j+'\n')
t.sort()
open('edge6target2.txt', 'w').write(''.join(t))
匿名:
import re


def conv(s):
    return re.sub("([^ ]*) (.).*", r"\2. \1", s)


names = ["Nishio Hirokazu",
         "Shibata Atsushi",
         "Masuda Yasushi"]

for n in names:
    print conv(n)


# sorted name list
names.sort()
for n in names:
    print conv(n)

匿名:
import re


def conv(s):
    return re.sub("([^ ]*) (.).*", r"\2. \1", s)


names = ["Nishio Hirokazu",
         "Shibata Atsushi",
         "Masuda Yasushi"]

for n in names:
    print conv(n)


# sorted name list
names.sort()
for n in names:
    print conv(n)

"""
>>> plist = PersonList()
>>> data = '''Nishio Hirokazu
... Shibata Atsushi
... Masuda Yasushi
... '''
...
>>> from StringIO import StringIO
>>> s = StringIO(data)
>>> plist.load(s)
>>> print plist
Y. Masuda
H. Nishio
A. Shibata
"""
class Person(object):
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def __cmp__(self, other):
        return cmp(self.lastname, other.lastname)

    def __str__(self):
        return "%s. %s" % (self.firstname[0], self.lastname)

class PersonList(object):
    def __init__(self):
        self.people = list()
            
    def load(self, f):
        if type(f) in (str, unicode):
            f = open(f)

        for line in f:
            splited = line.split(" ")
            if len(splited) == 2:
                lastname, firstname = splited
            person = Person(firstname, lastname)
            self.people.append(person)

    def __str__(self):
        return "\n".join([str(p) for p in sorted(self.people)])

def main(args):
    plist = PersonList()
    for filename in args:
        plist.load(filename)
        
    print plist

if __name__ == '__main__':
    import doctest
    doctest.testmod()
    

2007年06月12日 23:54に投稿した内容に誤りがありました。
以下訂正。

39,40c39,40
                 person = Person(firstname, lastname)
>                 self.people.append(person)

匿名:
fi = open("meibo.txt")##名簿ファイル読み込み
People = []##氏名リスト
fmly =[]##姓リスト
for i in fi.readlines():
    ii = i.strip().split(" ")##姓 名 分割リスト
    People.append("%s.%s"%(ii[1][0],ii[0]))
    if ii[0] in fmly:##姓リストチェック
        continue
    else:
        fmly.append(ii[0])
fi.close()

People.sort()##リスト並び替え
fmly.sort()##リスト並び替え

fmly_dict = {}##姓がキーの辞書作成
for fmly_nm in fmly:
    fmly_dict[fmly_nm] = []##valueは空のリスト

for person in People:
    search_target = person.split(".")[1]
    if search_target in fmly_dict:##姓を見て辞書に入れていく
        fmly_dict[search_target].append(person)

fo=open("meibo_I.txt","w")##出力ファイル
for fmly_nm in fmly:##姓リストにしたがって処理
    for I_name in fmly_dict[fmly_nm]:##姓をキーとして
        fo.write(I_name)
        fo.write("\n")
fo.close()
print "ok"

海坊主:

import sys

def main():
    try:
        input, output1, output2 = sys.argv[1:4]
    except ValueError:
        sys.stderr.write("usage: input_file output_file_1 output_file_2\n")
        return

    names = []
    for i, line in enumerate(open(input)):
        a = line.split()
        if len(a) != 2:
            raise ValueError("invalid name %r at line %d" % (line.strip(), i + 1))
        names.append(a)

    def write(output):
        io = open(output, "w")
        for a in names:
            io.write("%s. %s\n" % (a[1][0], a[0]))
        io.close()

    write(output1)
    names.sort()
    write(output2)

if __name__ == '__main__':
    main()

TF:
def main():
    data = "\n".join(["Shibata Jun", "Nishio Hirokazu", "Shibata Atsushi",
                      "Masuda Yasushi"])
    fout = file("foo.txt","w")
    createNameList(fout, data)

def createNameList(fout, data):
    names = [name for name in parse(data)]
    names.sort(cmp=lambda x,y: cmp((x.last,x.first), (y.last,y.first)))
    for name in names:
        print >>fout, render(name)


def parse(data):
    for wholeName in data.split("\n"):
        yield Name(*(wholeName.split(" ")))

def render(name):
    return "%s. %s" % (name.first[0], name.last)

class Name:
    def __init__(self, last, first):
        self.first = first
        self.last = last

if __name__ == "__main__":
    main()


juqfegv xkypi tzhiacqv ivuh eydwjlh fohpkdz uwzrmlcn
juqfegv xkypi tzhiacqv ivuh eydwjlh fohpkdz uwzrmlcn

コメントを投稿

About

2007年06月11日 19:03に投稿されたエントリーのページです。

ひとつ前の投稿は「お題5:行列の回転」です。

次の投稿は「お題7:整数とビット列の相互変換」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34