Python: setの並べ替えについての備忘録

Python

setを並べ替えたい事って良くあるよね

先のPython: setとsetのcopyについてにおいて、当方の理解の浅さの故だろうが、setのcopyについては参照と浅いコピーであっさり終わってしまった。

しかし、それはそれとして、普段一瞬あれ?と思ってしまうsetの要素の並べ替えについての備忘録。

setに並べ替えの関数は組み込まれていない

Python3におけるsetの属性は下記の通り。

>>> dir(set(lst))
['__and__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

setにはsortに関するメソッドは組み込まれていない事が分かる。

indexなどのデータの位置を特定するメソッドもない。

要はsetは重複を除いた集合を得る為に便利なものと理解しておく。

ではどうすれば並べ替えられるのか?

setはlistにして並べ替え

setはそもそも順不同な型なので、setのままで並べ替えて出力は無理。

listにして並べ替える。

>>> lst
[1, 2, 4, 6, 2, 3, 5, 7, 14, 16, 84, 133, 5]
>>> set(lst)
{1, 2, 3, 4, 5, 6, 7, 133, 14, 16, 84} # 要素の重複のない集合
>>> sorted(set(lst))
[1, 2, 3, 4, 5, 6, 7, 14, 16, 84, 133] # 集合を並べ替えたlist

sorted()はリストを返す関数

順番で考えると下記の様な気がするが、”sorted()”は「並べ替えたリストを返す」関数なので、”list”でlistにするくだりは不要。

>>> lst
[1, 2, 4, 6, 2, 3, 5, 7, 14, 16, 84, 133, 5]
>>> set(lst)
{1, 2, 3, 4, 5, 6, 7, 133, 14, 16, 84}
>>> list(set(lst))
[1, 2, 3, 4, 5, 6, 7, 133, 14, 16, 84] # この処理は不要
>>> sorted(list(set(lst)))
[1, 2, 3, 4, 5, 6, 7, 14, 16, 84, 133]

逆順に並べたい時には第二引数に”reverse=True”を指定。

>>> sorted(set(lst), reverse=True)
[133, 84, 16, 14, 7, 6, 5, 4, 3, 2, 1]

dict型の並べ替え

ちなみに、dict型のデータをsorted()にすると、keyを並べ替えたlistを出力する。

>>> dic = {"b":1, "d":2, "c":3, "a":4}
>>> sorted(dic)
['a', 'b', 'c', 'd']


コメント

タイトルとURLをコピーしました