1030

オブジェクト自体の属性で並べ替えたい Python オブジェクトのリストがあります。リストは次のようになります。

>>> ut
[<Tag: 128>, <Tag: 2008>, <Tag: <>, <Tag: actionscript>, <Tag: addresses>,
 <Tag: aes>, <Tag: ajax> ...]

各オブジェクトにはカウントがあります。

>>> ut[1].count
1L

カウント数の降順でリストをソートする必要があります。

これにはいくつかの方法を見てきましたが、Python でのベスト プラクティスを探しています。

4

8 に答える 8

1652
# To sort the list in place...
ut.sort(key=lambda x: x.count, reverse=True)

# To return a new list, use the sorted() built-in function...
newlist = sorted(ut, key=lambda x: x.count, reverse=True)

キーによるソートの詳細。

于 2008-12-31T16:42:59.820 に答える
102

特にリストに多数のレコードがある場合に最速の方法は、を使用することoperator.attrgetter("count")です。ただし、これはPythonのプレオペレーターバージョンで実行される可能性があるため、フォールバックメカニズムがあると便利です。次に、次のことを実行することをお勧めします。

try: import operator
except ImportError: keyfun= lambda x: x.count # use a lambda if no operator module
else: keyfun= operator.attrgetter("count") # use operator since it's faster than lambda

ut.sort(key=keyfun, reverse=True) # sort in-place
于 2008-12-31T17:48:21.937 に答える
82

読者は、key= メソッドが次のようになっていることに気付くはずです。

ut.sort(key=lambda x: x.count, reverse=True)

オブジェクトに豊富な比較演算子を追加するよりも何倍も高速です。これを読んで驚いた(「Python in a Nutshell」の485ページ)。この小さなプログラムでテストを実行することで、これを確認できます。

#!/usr/bin/env python
import random

class C:
    def __init__(self,count):
        self.count = count

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

longList = [C(random.random()) for i in xrange(1000000)] #about 6.1 secs
longList2 = longList[:]

longList.sort() #about 52 - 6.1 = 46 secs
longList2.sort(key = lambda c: c.count) #about 9 - 6.1 = 3 secs

私の非常に最小限のテストでは、最初の並べ替えは 10 倍以上遅いことが示されていますが、本によると、一般的には約 5 倍遅いだけです。彼らが言う理由は、python(timsort)で使用される高度に最適化されたソートアルゴリズムによるものです。

それでも、.sort(lambda) が単純な古い .sort() よりも高速であることは非常に奇妙です。彼らがそれを修正することを願っています。

于 2009-06-12T19:54:58.770 に答える
40
from operator import attrgetter
ut.sort(key = attrgetter('count'), reverse = True)
于 2008-12-31T19:00:33.507 に答える
16

これは、Django ORM モデル インスタンスのリストによく似ています。

次のようにクエリで並べ替えてみませんか。

ut = Tag.objects.order_by('-count')
于 2008-12-31T17:10:00.843 に答える
11

豊富な比較演算子をオブジェクト クラスに追加してから、リストの sort() メソッドを使用します。Python での豊富な比較を
参照してください。


更新:この方法は機能しますが、Triptych のソリューションの方が簡単なので、あなたのケースにより適していると思います。

于 2008-12-31T16:45:15.260 に答える