pythonのsortとsorted関数

5322 ワード

pythonを学習する過程で、pythonのソート相はc++の汎用アルゴリズムと似ているような気がしますが、c++よりも簡単で使いやすいです.
pythonのリストの内蔵関数sort()はリストの要素をソートすることができ、グローバルなsorted()関数は反復可能なすべてのシーケンスに適用されます.また、sort()関数は内蔵関数であり、現在のオブジェクトは変更されますが、sorted()関数は現在のオブジェクトを変更することなく、ソートされた現在のオブジェクトのコピーのみが返されます.
1、内蔵関数sort()
プロトタイプ:sort(fun,key,reverse=False)
パラメータfunは、このsort関数がどのアルゴリズムに基づいてソートされているかを示し、一般的にデフォルトではpythonでは集計ソートが使用され、一般的にはこのパラメータは書き換えられないので、基本的に無視できます.
パラメータkeyは、要素の比較のたびに呼び出される関数を指定します.この関数は、ソートのルール、すなわち、どのルールに従ってシーケンスをソートするかを表します.
パラメータreverseは逆順かどうかを示すために使用され、デフォルトのFalseの場合は昇順のルールでソートされ、reverse=Trueの場合は降順でソートされます.
簡単な例で説明します.
(個人的な趣味のため、私のコンパイラはpycharmなので、次のすべての例はpycharmで実行できます.)
#coding:utf-8
from operator import attrgetter,itemgetter

list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]

#          ,               
list1.sort()
print list1
#     [(2, 'huan', 23), (12, 'the', 14), (23, 'liu', 90)]

#         key      ,              
list1.sort(key=lambda x:(x[1]))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#         key      ,              
list1.sort(key=lambda x:(x[2]))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#        key      ,         2     ,
#     2      ,     0        
list1.sort(key=lambda x:(x[2],x[0]))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#  operator    itemgetter      key      ,     1        
list1.sort(key=itemgetter(1))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#  operator    itemgetter      key      ,     2        
list1.sort(key=itemgetter(2))
print list1
# [(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#       lambda      ,     
list1.sort(key=itemgetter(2,0))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

上記の匿名関数について、皆さんが知らないことを自分で理解してくれれば、ここでは展開しません.
ここでoperatorというモジュールの2つの関数について説明します.
(1)itemgetter operator.itemgetter
(
item
) operator. itemgetter
(
*items
)この関数は、入力されたオペランドの_を呼び出します.getitem__()メソッドはitem付き呼び出し可能なオブジェクトを返し、入力されたパラメータが複数である場合、1つのメタグループタイプを持つ呼び出し可能なオブジェクトを返します.例: f = itemgetter(2)、呼び出しf(r)以降、r[2]    g = itemgetter(2, 5, 3)、呼び出しg(r)はタプルに戻ります(r[2], r[5], r[3]) . (2)attrgetter operator. attrgetter
(
attr
) operator. attrgetter
(
*attrs
)
この関数は、オペランド内のattr属性を持つ呼び出し可能なオブジェクトを返し、複数の属性が入力されると、これらの属性を持つメタグループを返します.これらの属性の名前には複数のサブネームを含めることができます.
例:f = attrgetter('name')、呼び出しf(b)が戻りますb.name . f = attrgetter('name', 'date')、呼び出しf(b)が戻ります(b.name, b.date) . f = attrgetter('name.first', 'name.last')、呼び出しf(b)が戻ります(b.name.first, b.name.last)
2、グローバル関数sorted()
sorted()関数でのkeyの書き換えは、sort()関数と同じなので、さっきsort()で説明した方法は、sorted()関数に適用されますが、以下の説明では私も列挙しません.また、次に説明するkeyの書き換えもsort()関数に適用されます.では、なぜsort()関数で列挙しないのでしょうか.それは偏らないように、客観的に理解してもらうためです.
次の例に続きます.
from operator import attrgetter
class Data:
    article_name = str()
    readers = 0
    def __init__(self,tpl):
        self.article_name = tpl[0]
        self.readers = tpl[1]
    def getKey(self):
        return self.readers
    def __str__(self):
        return str(str(self.article_name)+str(':')+str(self.readers))

list1 = [Data(("java",100)),Data(("c++",100)),Data(("python",89)),Data(("c++",90))]

#    attrgetter      readers    
list2 = sorted(list1,key=attrgetter("readers"))
"""   
python:89
c++:90
java:100
c++:100
"""

#    list1   article_name    ,          readers    
list3 = sorted(list1,key=attrgetter("article_name","readers"))
"""
   :
c++:90
c++:100
java:100
python:89
"""

#                 
list4 = sorted(list1,key = Data.getKey)
"""
   :
python:89
c++:90
java:100
c++:100
"""
上記の例の結果は、いずれも印刷された結果である.
sorted()関数についても,sort()関数で紹介した方法を用いて,自分で試してみることができる.
もちろん最後に、上記のすべての例ではreverseパラメータを使用していませんが、このパラメータについては、ソートの方向を制御するために使用されていますので、自分でやってみてください.ここでは紹介しません.