回答編集履歴

5

修正

2019/08/29 04:39

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  ---
84
84
 
85
- 安定基数ソート。
85
+ 安定~~基数ソート~~バケットソート
86
86
 
87
87
  ```Python
88
88
 

4

追記

2019/08/29 04:39

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -75,3 +75,49 @@
75
75
  [4, 4, 4, 4, 6, 6, 2, 2]
76
76
 
77
77
  ```
78
+
79
+
80
+
81
+ 発展的な方法
82
+
83
+ ---
84
+
85
+ 安定基数ソート。
86
+
87
+ ```Python
88
+
89
+ import collections
90
+
91
+
92
+
93
+
94
+
95
+ class OrderedCounter(collections.Counter, collections.OrderedDict):
96
+
97
+ pass
98
+
99
+
100
+
101
+ src = [4, 6, 2, 2, 6, 4, 4, 4]
102
+
103
+ counter = OrderedCounter(src)
104
+
105
+
106
+
107
+ dst = [
108
+
109
+ key
110
+
111
+ for key, num in counter.most_common()
112
+
113
+ for _ in range(num)
114
+
115
+ ]
116
+
117
+ print(dst)
118
+
119
+ ```
120
+
121
+
122
+
123
+ **参考:** [python - Creating an Ordered Counter - Stack Overflow](https://stackoverflow.com/questions/35446015/creating-an-ordered-counter)

3

修正

2019/08/29 04:31

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -75,57 +75,3 @@
75
75
  [4, 4, 4, 4, 6, 6, 2, 2]
76
76
 
77
77
  ```
78
-
79
-
80
-
81
- おまけ:惜しい方法
82
-
83
- ---
84
-
85
- collections.Counterを使うと、簡潔で高速に実装できます。
86
-
87
- ```Python
88
-
89
- import collections
90
-
91
-
92
-
93
- src = [4, 6, 2, 2, 6, 4, 4, 4]
94
-
95
-
96
-
97
- dst = list(collections.Counter(src).elements())
98
-
99
- print(dst)
100
-
101
- ```
102
-
103
-
104
-
105
- **実行結果** [Wandbox](https://wandbox.org/permlink/wnNA3HaTPZQXusl7)
106
-
107
- ```
108
-
109
- [4, 4, 4, 4, 6, 6, 2, 2]
110
-
111
- ```
112
-
113
-
114
-
115
- 基数ソートなので、組み込みソートに勝ち目は有りません。
116
-
117
- ただし、なぜ惜しいと書いているかと言うと...
118
-
119
- > **elements()**
120
-
121
- それぞれの要素を、そのカウント分の回数だけ繰り返すイテレータを返します。要素は任意の順序で返されます。
122
-
123
-
124
-
125
- 引用元: [collections --- コンテナデータ型 — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/library/collections.html#collections.Counter.elements)
126
-
127
-
128
-
129
- 順序が保証されないからなんですね。
130
-
131
- Counterとcollections.OrderedDictを継承させたクラスを使えば上手く行くのかな。

2

追記

2019/08/29 04:27

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  ただしlist.indexもlist.countも線型の計算量を要するので、
30
30
 
31
- 本来なら前以て評価用のデータを生成しておくべきです。
31
+ 本来なら前以て評価用のデータを生成しておくのが好ましいです。
32
32
 
33
33
 
34
34
 
@@ -75,3 +75,57 @@
75
75
  [4, 4, 4, 4, 6, 6, 2, 2]
76
76
 
77
77
  ```
78
+
79
+
80
+
81
+ おまけ:惜しい方法
82
+
83
+ ---
84
+
85
+ collections.Counterを使うと、簡潔で高速に実装できます。
86
+
87
+ ```Python
88
+
89
+ import collections
90
+
91
+
92
+
93
+ src = [4, 6, 2, 2, 6, 4, 4, 4]
94
+
95
+
96
+
97
+ dst = list(collections.Counter(src).elements())
98
+
99
+ print(dst)
100
+
101
+ ```
102
+
103
+
104
+
105
+ **実行結果** [Wandbox](https://wandbox.org/permlink/wnNA3HaTPZQXusl7)
106
+
107
+ ```
108
+
109
+ [4, 4, 4, 4, 6, 6, 2, 2]
110
+
111
+ ```
112
+
113
+
114
+
115
+ 基数ソートなので、組み込みソートに勝ち目は有りません。
116
+
117
+ ただし、なぜ惜しいと書いているかと言うと...
118
+
119
+ > **elements()**
120
+
121
+ それぞれの要素を、そのカウント分の回数だけ繰り返すイテレータを返します。要素は任意の順序で返されます。
122
+
123
+
124
+
125
+ 引用元: [collections --- コンテナデータ型 — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/library/collections.html#collections.Counter.elements)
126
+
127
+
128
+
129
+ 順序が保証されないからなんですね。
130
+
131
+ Counterとcollections.OrderedDictを継承させたクラスを使えば上手く行くのかな。

1

追記

2019/08/29 04:26

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -29,3 +29,49 @@
29
29
  ただしlist.indexもlist.countも線型の計算量を要するので、
30
30
 
31
31
  本来なら前以て評価用のデータを生成しておくべきです。
32
+
33
+
34
+
35
+ 例えば、こんなふうに。
36
+
37
+ ```Python
38
+
39
+ key = {}
40
+
41
+ src = [4, 6, 2, 2, 6, 4, 4, 4]
42
+
43
+
44
+
45
+ for i, e in enumerate(src):
46
+
47
+ if e in key:
48
+
49
+ key[e][0] += 1
50
+
51
+ else:
52
+
53
+ key[e] = [1, -i]
54
+
55
+
56
+
57
+ print(key)
58
+
59
+
60
+
61
+ dst = sorted(src, key=key.get, reverse=True)
62
+
63
+ print(dst)
64
+
65
+ ```
66
+
67
+
68
+
69
+ **実行結果** [Wandbox](https://wandbox.org/permlink/lSI09DlTbc0IHHD7)
70
+
71
+ ```
72
+
73
+ {4: [4, 0], 6: [2, -1], 2: [2, -2]}
74
+
75
+ [4, 4, 4, 4, 6, 6, 2, 2]
76
+
77
+ ```