0

そのように定義されたリストがある場合:

myresults = [
    [1,"A",2],
    [2,"Z",1],
    [3,"J",0]
    ]

リストをソートする必要があります。リスト内でソートする位置でsorted()あるキー関数lambda=x:x[i]で関数を使用できることはわかっています。iしたがって、これは機能するはずです:

print sorted(myresults, key=lambda x:x[1])

サブリストの2列目にソートされたリストを返します。

多次元リストを処理するためにクイックソート アルゴリズムをどのように適応させますか?

4

3 に答える 3

3

迅速で汚い解決策。クイックソートが次のようになっている場合:

def qsort(lst):
    if len(lst) == 0:
        return []
    else:
        pivot = lst[0]
        lesser = qsort([x for x in lst[1:] if x < pivot])
        greater = qsort([x for x in lst[1:] if x >= pivot])
        return lesser + [pivot] + greater

インデックス変数を使用して、必要なディメンションで並べ替えることができます。

def qsort_index(lst, index):
    if len(lst) == 0:
        return []
    else:
        pivot = lst[0]
        lesser = qsort_index([x for x in lst[1:] if x[index] < pivot[index]], index)
        greater = qsort_index([x for x in lst[1:] if x[index] >= pivot[index]], index)
        return lesser + [pivot] + greater



>>> qsort_index(myresults, 0)
[[1, 'A', 2], [2, 'Z', 1], [3, 'J', 0]]
>>> qsort_index(myresults, 1)
[[1, 'A', 2], [3, 'J', 0], [2, 'Z', 1]]
>>> qsort_index(myresults, 2)
[[3, 'J', 0], [2, 'Z', 1], [1, 'A', 2]]

この実装は最適とはほど遠いですが、アイデアは得られたと思います。

于 2012-05-16T13:56:17.807 に答える
2

Python のoperatorモジュールを使用できます。

import operator
sorted(myresults, key=operator.itemgetter(0))
[[1, 'A', 2], [2, 'Z', 1], [3, 'J', 0]]
sorted(myresults, key=operator.itemgetter(1))
[[1, 'A', 2], [3, 'J', 0], [2, 'Z', 1]]
于 2012-05-16T13:50:15.633 に答える
1

この方法で達成できます:

import operator
list.sort(key=operator.itemgetter(*args))

そしてこれもうまくいく..

import operator
sorted(list, key=operator.itemgetter(1))
于 2012-05-16T13:49:46.773 に答える