teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2020/10/21 04:23

投稿

lehshell
lehshell

スコア1180

answer CHANGED
@@ -1,5 +1,11 @@
1
1
  > このようなリストをアルファベット順(大文字が絶対先に入る)。
2
2
  > なおかつ 文字列の長さを基準に考えて出現回数の多い順に並べたいです。
3
+
4
+ 「アルファベット順(大文字が絶対先に入る)」の意図が
5
+ **'BC', 'ab', 'aB', 'Ab', 'AB'**
6
+
7
+ **'AB', 'Ab', 'BC', 'aB', 'ab'**
8
+ にソートする場合
3
9
  ```Python
4
10
  lst.sort() # 大文字優先でアルファベット順にソート
5
11
  nums = [len(s) for s in lst] # 単語の文字列長を抽出
@@ -11,4 +17,20 @@
11
17
 
12
18
  # 重み付けした出現回数でソート
13
19
  lst.sort(key=lambda s: dic[len(s)], reverse=True)
20
+ ```
21
+ 「アルファベット順(大文字が絶対先に入る)」の意図が
22
+ **'BC', 'ab', 'aB', 'Ab', 'AB'**
23
+
24
+ **'AB', 'Ab', 'aB', 'ab', 'BC'**
25
+ にソートする場合 lst.sort(key=lambda s: s.lower()) を lst.sort() の直後に追加します。
26
+ ```Python
27
+ lst.sort() # 大文字優先でアルファベット順にソート
28
+ lst.sort(key=lambda s: s.lower()) # B より a を前にソート
29
+ nums = [len(s) for s in lst] # 単語の文字列長を抽出
30
+ ns = [n for n in set(nums)] # 文字列長の重複を削除
31
+ ns.sort() # lst 内の単語の文字列長をソート
32
+ # 異なる文字列長で出現回数が同じものを考慮して出現回数を重み付けした辞書を生成する
33
+ dic = {n:nums.count(n) * len(ns) - i for i, n in enumerate(ns)}
34
+ # 重み付けした出現回数でソート
35
+ lst.sort(key=lambda s: dic[len(s)], reverse=True)
14
36
  ```