前にこんなのやりました。
アルゴリズム考えたり検証したりするのは確かに勉強になったし楽しかったけど、あまりにもバカバカしくなったので、ちゃんとソートの呼び出し関数を変更するだけのスマートな方法も載せておく。
参考にしたもの:
entertainment-lab: Pythonで独自ソートの実装:
#コード全体
肝心かなめのソートの部分をPython純正のsortに任せるので、当然のことながらすごく短くなる。
ranking_sort.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, December 2014.
description = """
自己分析用ランク付けインターフェース。
このアプリケーションでは
与えたリストをもとに比較質問を作成し、
ユーザーがそれに答えていくとランキングが完成する。
"""
import argparse
import sys
def human_cmp(a, b):
print '\nwhich ones do you like?'
print ' [j]: %s, [k]: %s. [=]:eq' % (a, b)
key_input = raw_input(">>> ")
if key_input == 'j':
ans = -1
elif key_input == 'k':
ans = 1
elif key_input == '=':
ans = 0
else:
raise ValueError('please select by "j", "k" or "=".')
return ans
if __name__ == '__main__':
parse = argparse.ArgumentParser(description=description)
parse.add_argument('-l', '--list',
dest='objects',
nargs='*',
type=str,
help='list of some objects',
default=argparse.SUPPRESS
)
args = parse.parse_args()
data = args.objects
data.sort(cmp=human_cmp)
print data
human_cmpとしたのがsort関数に渡す関数。気をつけるのはその関数の返す値だけ。二つの引数を比べて、第1引数が第2引数より小さければ負、同じなら0、大きければ正の値を返すようにする。
#実行例
➤ python ranking_sort.py -l 3 1 4 8 5 2 6 7
which ones do you like?
[j]: 1, [k]: 3. [=]:eq
>>> j
which ones do you like?
[j]: 4, [k]: 1. [=]:eq
>>> k
which ones do you like?
[j]: 4, [k]: 3. [=]:eq
>>> k
which ones do you like?
[j]: 8, [k]: 3. [=]:eq
>>> k
which ones do you like?
[j]: 8, [k]: 4. [=]:eq
>>> k
which ones do you like?
[j]: 5, [k]: 4. [=]:eq
>>> k
which ones do you like?
[j]: 5, [k]: 8. [=]:eq
>>> j
which ones do you like?
[j]: 2, [k]: 4. [=]:eq
>>> j
which ones do you like?
[j]: 2, [k]: 3. [=]:eq
>>> j
which ones do you like?
[j]: 2, [k]: 1. [=]:eq
>>> k
which ones do you like?
[j]: 6, [k]: 4. [=]:eq
>>> k
which ones do you like?
[j]: 6, [k]: 8. [=]:eq
>>> j
which ones do you like?
[j]: 6, [k]: 5. [=]:eq
>>> k
which ones do you like?
[j]: 7, [k]: 4. [=]:eq
>>> k
which ones do you like?
[j]: 7, [k]: 6. [=]:eq
>>> k
which ones do you like?
[j]: 7, [k]: 8. [=]:eq
>>> j
['1', '2', '3', '4', '5', '6', '7', '8']
これは人力だけど、もちろん参考元みたいに自分で何らかの関数を定義してもいい。
#あとがき
この前の時間はいったい・・・。楽しかったから良かったのよ。そう言い聞かせるしかないのよ・・・。というか、気づいてみれば書くまでもないことだった。