LoginSignup
3
3

More than 5 years have passed since last update.

Re:人力ソート【Python】

Last updated at Posted at 2014-12-03

前にこんなのやりました。

【車輪の再発明】人力トーナメントソート【Python】

アルゴリズム考えたり検証したりするのは確かに勉強になったし楽しかったけど、あまりにもバカバカしくなったので、ちゃんとソートの呼び出し関数を変更するだけのスマートな方法も載せておく。

参考にしたもの:
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']

これは人力だけど、もちろん参考元みたいに自分で何らかの関数を定義してもいい。

あとがき

この前の時間はいったい・・・。楽しかったから良かったのよ。そう言い聞かせるしかないのよ・・・。というか、気づいてみれば書くまでもないことだった。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3