回答編集履歴

1

「'BC', 'ab', 'aB', 'Ab', 'AB'」 → 「'AB', 'Ab', 'aB', 'ab', 'BC'」のソートの場合を追加

2020/10/21 04:23

投稿

lehshell
lehshell

スコア1147

test CHANGED
@@ -1,6 +1,18 @@
1
1
  > このようなリストをアルファベット順(大文字が絶対先に入る)。
2
2
 
3
3
  > なおかつ 文字列の長さを基準に考えて出現回数の多い順に並べたいです。
4
+
5
+
6
+
7
+ 「アルファベット順(大文字が絶対先に入る)」の意図が
8
+
9
+ **'BC', 'ab', 'aB', 'Ab', 'AB'**
10
+
11
+
12
+
13
+ **'AB', 'Ab', 'BC', 'aB', 'ab'**
14
+
15
+ にソートする場合
4
16
 
5
17
  ```Python
6
18
 
@@ -25,3 +37,35 @@
25
37
  lst.sort(key=lambda s: dic[len(s)], reverse=True)
26
38
 
27
39
  ```
40
+
41
+ 「アルファベット順(大文字が絶対先に入る)」の意図が
42
+
43
+ **'BC', 'ab', 'aB', 'Ab', 'AB'**
44
+
45
+
46
+
47
+ **'AB', 'Ab', 'aB', 'ab', 'BC'**
48
+
49
+ にソートする場合 lst.sort(key=lambda s: s.lower()) を lst.sort() の直後に追加します。
50
+
51
+ ```Python
52
+
53
+ lst.sort() # 大文字優先でアルファベット順にソート
54
+
55
+ lst.sort(key=lambda s: s.lower()) # B より a を前にソート
56
+
57
+ nums = [len(s) for s in lst] # 単語の文字列長を抽出
58
+
59
+ ns = [n for n in set(nums)] # 文字列長の重複を削除
60
+
61
+ ns.sort() # lst 内の単語の文字列長をソート
62
+
63
+ # 異なる文字列長で出現回数が同じものを考慮して出現回数を重み付けした辞書を生成する
64
+
65
+ dic = {n:nums.count(n) * len(ns) - i for i, n in enumerate(ns)}
66
+
67
+ # 重み付けした出現回数でソート
68
+
69
+ lst.sort(key=lambda s: dic[len(s)], reverse=True)
70
+
71
+ ```