2011年06月17日

Pythonでオブジェクトのlistをソート・リバース・マージする方法。

Python初心者の俺が、オブジェクトのリストをソートしたりリバースしたりマージしたりする方法を知ったのでメモがてらに書いておこうと思う。前回はGAE/PでAOPする方法とか書いてたくせに、急に肩の力が抜けるエントリで恐縮である。

おっとその前に、まずはオブジェクトのリストではなく単純な文字列や数値のリストをソート・リバース・マージする方法から紹介しておこう。

# -*- coding: utf-8 -*-

# ソート
lst = ['apo', 'apa', 'baa']
lst.sort()
print lst

# リバース
lst = ['apo', 'apa', 'baa']
lst.reverse()
print lst

# マージ
from heapq import merge
lst1 = ['hoge', 'foo']
lst2 = ['baa', 'baz']
lst = list(merge(lst1, lst2))
print lst


これを実行するとこうなる。
['apa', 'apo', 'baa']
['baa', 'apa', 'apo']
['baa', 'baz', 'hoge', 'foo']


マージの時だけは from heapq import merge を使う必要がある。他の方法でもやれなくはないが、これを使うのが一番手っ取り早いしソースも綺麗だと思われる。

さて、いよいよオブジェクトのリストをソートまたはリバースする方法だ。ちょっとだけ敷居が上がるが、Python2.4以降だと import operator すれば非常に簡単に実現できる。

# -*- coding: utf-8 -*-
import operator

# 商品クラス
class Item:
def __init__(self, name, price):
self.name = name # 商品名
self.price = price # 価格
def __repr__(self):
return "Item(%s, %d)" % (self.name, self.price)

# まずは商品オブジェクトのリストを生成
lst = [Item('banana', 99),
Item('apple',60),
Item('kiwi',40)]

# 商品名でソート
lst.sort(key=operator.attrgetter('name'))
print lst

# 価格でソート
lst.sort(key=operator.attrgetter('price'))
print lst

# 価格でリバース
lst.sort(key=operator.attrgetter('price'), reverse=True)
print lst

# リストをマージ
from heapq import merge
lst2 = [Item('hoge', 11),
Item('foo',22)]
lst = list(merge(lst, lst2))
print lst


以下は実行結果だ。
[Item(apple, 60), Item(banana, 99), Item(kiwi, 40)]
[Item(kiwi, 40), Item(apple, 60), Item(banana, 99)]
[Item(banana, 99), Item(apple, 60), Item(kiwi, 40)]
[Item(banana, 99), Item(apple, 60), Item(kiwi, 40), Item(hoge, 11), Item(foo, 22)]


素晴らしくシンプルである。


ここはひとつポチっとよろしく。
人気ブログランキングへ

エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス
売り上げランキング: 4805


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 40082



posted by 寄り道退屈男 at 10:50 | Comment(0) | TrackBack(0) | GAE for Python
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/46085291
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック