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で実行できます.)
上記の匿名関数について、皆さんが知らないことを自分で理解してくれれば、ここでは展開しません.
ここでoperatorというモジュールの2つの関数について説明します.
(1)itemgetter
(
item
)
(
*items
)この関数は、入力されたオペランドの_を呼び出します.getitem__()メソッドはitem付き呼び出し可能なオブジェクトを返し、入力されたパラメータが複数である場合、1つのメタグループタイプを持つ呼び出し可能なオブジェクトを返します.例:
(
attr
)
(
*attrs
)
この関数は、オペランド内のattr属性を持つ呼び出し可能なオブジェクトを返し、複数の属性が入力されると、これらの属性を持つメタグループを返します.これらの属性の名前には複数のサブネームを含めることができます.
例:
2、グローバル関数sorted()
sorted()関数でのkeyの書き換えは、sort()関数と同じなので、さっきsort()で説明した方法は、sorted()関数に適用されますが、以下の説明では私も列挙しません.また、次に説明するkeyの書き換えもsort()関数に適用されます.では、なぜsort()関数で列挙しないのでしょうか.それは偏らないように、客観的に理解してもらうためです.
次の例に続きます.
sorted()関数についても,sort()関数で紹介した方法を用いて,自分で試してみることができる.
もちろん最後に、上記のすべての例ではreverseパラメータを使用していませんが、このパラメータについては、ソートの方向を制御するために使用されていますので、自分でやってみてください.ここでは紹介しません.
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パラメータを使用していませんが、このパラメータについては、ソートの方向を制御するために使用されていますので、自分でやってみてください.ここでは紹介しません.