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']
コメント